主要内容:
1.不可变的原始值和可变的对象引用
javascript中的原始值(undefined、null、布尔值、数字和字符串)与对象(包括数组和函数)有着根本的区别。原始值是不可更改的;任何方法都无法更改一个原始值。
通过上图可以看出,原始值的比较是值的比较:只有它们的值相等时它们才相等;对象和原始值不同,首先,它们是可变的--它们的值是可修改的;两个单独的对象永不相等。两个单独的数组也不相等。如果我们想比较两个单独对象或者数组,则必须比较它们的属性或元素。
2.类型转换:
如图:
注意:一个值转换为另一个值并不意味着两个值相等。比如,如果在期望使用布尔值的地方使用了undefined,它将会转换为false,但这并不表时undefined==false.
重复的声明和遗漏的声明:
使用var 语句重复声明变量是合法且无害的。如果重复声明带有初始化器,那么这就和一条简单的赋值语句没有什么两样。
变量作用域
变量的作用域(scope)是程序源代码中定义这个变量的区域。全局变量拥有全局作用域,在javascript代码中的任何地方都是有定义的。然而在函数内声明的变量只在函数体内有定义。它们是局部变量,作用域是局部性的。函数参数也是局部变量,它们只在函数体内有定义。
在函数体内,局部变量优先级高级同名的全局变量。
函数作用域和声明提前
在类似C语言的编程语言中,花括号内每一段代码都具有各自的作用域,而且变量在声明它们的代码之外是不可见的。我们称之为块级作用域。javascript中没有块级作用域 。取而代之地使用了函数作用域:
javascript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。这意味着在声明之前甚至已经可用,javascript的这个特性被非正式地称为声明提前。如图:
作为属性的变量
当声明一个javascript变量时,实际上定义了全局对象的一个属性,当使用var声明一个变量时。创建的这个属性是不可配置的,也就是说这 个变量无法通过delete运算符删除。
引用数据类型数组:
数组是一个引用对象,其长度可变,元素内容也可以不一致,
如:var arr = [1,2,3,true,new Date()];
这个定义数组也是可以的。
当我们调用数组对象时,其实隐式调用了数组对象的tostring()方法;所以此输出方法与console.info(arr.tostring())是一样的;
数组中splice方法应用:
通过图示可以看出,splice操作数组本身;
concat与join示例:
通过示例可以看出,concat方法与join方法都不会影响数组本身,但会生成新的对象;
ECMA5数组新特性:
indexOf(),every、filter、forEach、map、some
every:对数组中每一个元素进行处理比较,如果全部比较结果为真则返回true,否则返回false;
filter:对数组的每个元素用一个函数处理,将过滤后的结果返回:
map:对数组中每一个元素交给函数处理,并生成一个新的数据对象:
some:对数组中每一个元素都进行遍历处理,如果有一个条件为真,则返回true,否则返回false;
reduce:对数组中前一个元素和后一个元素作处理,遍历方式从右向左: