数据类型
·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 对象的属性也可以通过方括号访问。
·枚举
你可以在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()使用作为参数传入的字符编码创建一个新的字符串。