JavaScript数据类型及语言基础

数据类型

·6种原始类型:

    Boolean

    Null

    Undefined

    Number

    String

    Symbol (new in ECMAScript 6)

·Object

注意:

·一个没有被赋值的变量会有个默认值 undefined

typeof null    // object (bug in ECMAScript, should be null)

typeof undefined // undefined

null === undefined // false

null == undefined // true

·Number 数字类型,它并没有为整数给出一种特定的类型。除了能够表示浮点数外,还有一些带符号的值:+Infinity,-Infinity 和 NaN (非数值,Not-a-Number)。

·NaN与任何值都不相等,包括自身。应当使用x != x来判断,当且仅当 x 为 NaN 的时候,表达式的结果才为true。相似的函数有isNaN(),isFinite()。

·数组直接量的语法允许有可选的结尾逗号,故[,,]只有两个元素而非三个。

判断各种数据类型的方法

类型检测优先使用 typeof,对象类型检测使用 instanceof,null 或 undefined 的检测使用 == null。

typeof variable==='string'  // string

typeof variable==='number' // number

typeof variable==='boolean' // boolean

typeof variable==='function'  // Function

typeof variable==='object'  // Object

variable instanceof RegExp // RegExp

variable instanceof Array // Array

variable===null // null

variable==null // null or undefined

typeof variable==='undefined' // undefined

判断arr是否为一个数组,返回一个bool值

function isArray(arr) {

    return'[object Array]'===Object.prototype.toString.call(arr);

}

首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于"[object Array]"的字符串作为结果(看过ECMA标准的应该都知道,[[]]用来表示语言内部用到的、外部不可直接访问的属性,称为“内部属性”)。利用这个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。

call改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是'[object Array]',以判断其是否是Array的实例。

这个方法很好的解决了跨frame对象构建的问题,经过测试,各大浏览器兼容性也很好,可以放心使用。

Javascript数组类型检测 (参考资料)

在 ECMAScript5 中,可以直接使用Array.isArray()来判断数组。

function isArray(arr) {

   return Array.isArray(arr);

}

不推荐使用instanceof,因为可能会有多窗体(frame)存在。

这样每一个窗口都有一个自己的 JavaScript 环境,有自己的全局对象。并且每个全局对象都有自己的一组构造函数。因此一个窗体中的对象不可能是另外窗体中的构造函数的实例。

判断fn是否为一个函数,返回一个bool值

function isFunction(fn) {

     return '[object Function]' === Object.prototype.toString.call(fn);

}

值类型和引用类型的区别

·值类型

声明一个值类型变量,编译器会在栈上分配一个空间,这个空间对应着该值类型变量,空间里存储的就是该变量的值。存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。

·引用类型

引用类型的实例分配在堆上,新建一个引用类型实例,得到的变量值对应的是该实例的内存分配地址,这就像您的银行账号一样。存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。

为变量赋值时,ECMAScript 的解释程序必须判断该值是原始类型,还是引用类型。要实现这一点,解释程序则需尝试判断该值是否为 ECMAScript 的原始类型之一,即 Undefined、Null、Boolean、Number 和 String 型。由于这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 - 栈中。这样存储便于迅速查寻变量的值。

如果一个值是引用类型的,那么它的存储空间将从堆中分配。由于引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。

JavaScript中原始值包括:undefined,null,布尔值,数字和字符串。引用类型主要指对象(包括数组和函数)。

·原始值是不可更改的。对象的值是可修改的。

·原始值的比较是值的比较。对象的比较并非值的比较。对象的值都是引用,对象的比较均是引用的比较,当且仅当他们都引用同一个基对象时,他们才相等。

各种对象的读取、遍历方式

参考:JavaScript指南-使用对象

·对象

在javascript中,一个对象可以是一个单独的拥有属性和类型的实体。我们拿它和一个杯子做下类比。一个杯子是一个对象(物体),拥有属性。杯子有颜色,图案,重量,由什么材质构成等等。同样,javascript对象也有属性来定义它的特征。

·属性

一个 javascript 对象有很多属性。一个对象的属性可以被解释成一个附加到对象上的变量。对象的属性和普通的 javascript 变量基本没什么区别,仅仅是属性属于某个对象。属性定义了对象的特征(译注:动态语言面向对象的鸭子类型)。你可以通过点符号来访问一个对象的属性。JavaScript 对象的属性也可以通过方括号访问。

·枚举

你可以在for...in语句中使用方括号标记以枚举一个对象的所有属性。为了展示它如何工作,下面的函数当你将对象及其名称作为参数传入时,显示对象的属性:

function showProps(obj,objName){

    var result="";

    for(var i in obj){

      if(obj.hasOwnProperty(i)){

        result+=objName+"."+i+" = "+obj[i]+"\n";

      }

    }

    return result;

}

var srcObj={

    a:1,

    b:{

        b1:["hello","hi"],

        b2:"JavaScript"

    }

};

console.log(showProps(srcObj,'srcObj'));

这里使用hasOwnProperty()是为了确保是自己的属性而非继承的属性。

function showPropsWithoutFun(obj,objName){

    var result = "";

    for (var i in obj){

        if(!obj.hasOwnProperty(i)){

            continue;

        }

        if(typeof obj[i]) === "function"){

            continue;

        }

        result += objName + "." + i + "=" + obj[i] + "\n";

    }

    return result;

}

Object.keys()方法会返回一个由给定对象的所有可枚举自身属性的属性名组成的数组,数组中属性名的排列顺序和使用for-in循环遍历该对象时返回的顺序一致(两者的主要区别是 for-in 还会遍历出一个对象从其原型链上继承到的可枚举属性)。

Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性)组成的数组。

·创建对象

创建对象的方式有三种:对象直接量,关键字new,使用Object.create()方法。

Object.create()方法创建一个拥有指定原型和若干个指定属性的对象。

·继承

所有的 JavaScript 对象继承于至少一个对象。被继承的对象被称作原型,并且继承的属性可能通过构造函数的 prototype 对象找到。

·定义方法

一个方法 是关联到某个对象的函数,或者简单地说,一个方法是一个值为某个函数的对象属性。定义方法就象定义普通的函数,除了它们必须被赋给对象的某个属性。

深度克隆

浅度克隆:基本类型为值传递,对象仍为引用传递。

深度克隆:所有元素或属性均完全克隆,并于原引用类型完全独立,即,在后面修改对象的属性的时候,原对象不会被修改。

参考:白话简单克隆和深度克隆  javascript克隆对象深度介绍

Array 对象

·Array 对象属性

constructor    返回对创建此对象的数组函数的引用。

length           设置或返回数组中元素的数目。

prototype     使您有能力向对象添加属性和方法。

·Mutator 方法,这些方法可以改变数组自身

pop    移除数组的最后一个元素,返回值是被删除的元素。

push    在数组的末尾添加一个或者多个元素,返回值是新的数组的长度。

reverse    颠倒数组中元素的顺序,原先第一个元素现在变成最后一个,同样原先的最后一个元素变成了现在的第一个,也就是数组的索引发生了变化。

shift    删除数组的第一个元素,返回值是删除的元素。

sort    对数组中的元素进行排序。

splice     添加或删除数组中的一个或多个元素。

unshift    添加一个或者多个元素在数组的开头,返回值是新的数组的长度。

·Accessor 方法,这些过程不改变数组自身 These methods do not modify the array and return some representation of the array.

concat    返回一个包含此数组和其他数组和/或值的结合的新数组

indexOf    返回第一个与给定参数相等的数组元素的索引,没有找到则返回-1。

join    将所有的数组元素连接成一个字符串。

lastIndexOf    返回在数组中搜索到的与给定参数相等的元素的最后(最大)索引。

slice    返回数组中的一段。

toSource    Returns an array literal representing the specified array; you can use this value to create a new array. Overrides the Object.toSource method.

toString    返回代表该数组及其元素的字符,重写Object.toString 过程.

valueOf    Returns the primitive value of the array. Overrides the Object.valueOf method.

·循环(迭代)过程

filter    对数组中的每一个元素调用参数中指定的过滤函数,并将对于过滤函数返回值为true的那些数组元素集合为新的数组返回。

forEach    对数组的每一个元素依次调用参数中指定的函数。

every    如果数组中每一个元素都满足参数中提供的测试函数,则返回真。

map    Creates a new array with the results of calling a provided function on every element in this array.

some    如果数组中至少有一个元素满足参数函数的测试,则返回true。

正则表达式 参考:RegExp 

^:匹配字符串的开头,在多行检索中,匹配一行的开头。

$:匹配字符串的结尾,在多行检索中,匹配一行的结尾。

|:选择,匹配的是该符号左边的子表达式或右边的子表达式。

\s:任何 Unicode 空白符。

g:执行一个全局匹配,简言之,即找到所有匹配,而不是找到第一个之后就停止。

String对象

·String 对象属

constructor    对创建该对象的函数的引用

length    字符串的长度

prototype    允许您向对象添加属性和方法

·String 对象方法

charAt()    返回在指定位置的字符。

charCodeAt()    返回在指定的位置的字符的 Unicode 编码。

concat()    连接字符串。

indexOf()    检索字符串。

lastIndexOf()    从后向前搜索字符串。

localeCompare()    用本地特定的顺序来比较两个字符串。

match()    找到一个或多个正则表达式的匹配。

replace()     替换与正则表达式匹配的子串。

search()    检索与正则表达式相匹配的值。

slice()    提取字符串的片断,并在新的字符串中返回被提取的部分。

split()    把字符串分割为字符串数组。

substr()    从起始索引号提取字符串中指定数目的字符。

substring()    提取字符串中两个指定的索引号之间的字符。

toLowerCase()     把字符串转换为小写。

toUpperCase()    把字符串转换为大写。

toString()    返回字符串。

valueOf()    返回某个字符串对象的原始值。

·静态方法

String.fromCharCode()使用作为参数传入的字符编码创建一个新的字符串。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,965评论 6 13
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,233评论 0 4
  • 哭过,不想被人听到声音。小c找我说话,他语音聊,我则开着语音输入法输文字。自己听自己声音很颓,嗯,真羡慕他声音里的...
    红衣的坑阅读 292评论 0 0
  • 爱的翅膀 给我一双翅膀 让我自由飞翔 你愿意吗 我带着一颗心来 却不曾见我离去的身影 是你留住了我? 是我不忍离去...
    dr了墨阅读 290评论 2 3