一、语句与表达式
{ foo: fn() }
这段代码有二义性
1. ‘foo:’可以看作标签 ,{}看做代码块,这时是语句
2.对象字面量,这时是表达式
function fn(){}
这段代码也具有二义性
1.看做函数声明(语句)
2.具名函数表达式
因此以上两端代码用eval解析时应当添加括号来作为表达式输出值
eval('({ foo : fn() })');
eval('(function fn(){})');
二、分号自动插入机制(ASI)
在以下情况中会自动插入分号
1.换行符后跟非法字符
例如 :
var a = 1
console.log(a);
由于‘c’在 ‘1’后为非法字符所以会自动添加换行
陷阱:
fn()
["aaa"].length;
此处由于‘[’合法所以 ‘aaa’会看作是fn返回值得属性
陷阱 :
function(){
return
{}
}
此处 ‘return’后会添加分号,最后返回值为 undefined
2.代码片段结束处
例如:
if(a == b){ return a }
此处在 ‘a’ 后会添加分号
3.文件结束处
三、类型比较
1.typeof 和 instanceof
typeof undefined == undefined//true
typeof 1 == "number";//true
typeof "1" == "string";//true
typeof true == "boolean";//true
typeof [] == "object";//true
typeof {} == "object";//true
[] instanceof Array;//true
{} instanceof Array; //true
2.真值假值
0 ,”(空字符串),false ,undefined ,null 都为假值;其余为真值;
3.== 与 ===
===为严格相等,类型不同则必定不等;
==为宽松相等,类型不同会先进行类型转换;
undefined == null
0 == false
0 == ""
"" == false
//所有假值互相宽松相等
'2' == 2
'2.1' == 2.1
//字符串与数字比较转换成数字
NaN !== NaN
对于不是原始类型的,先转换成原始类型
实现 toPrimitive(variety ,type)
参数 type为 ‘number’
1. 调用valueOf()方法 ;
2. 调用toString()方法;
3. 报错;
参数type 为 ‘string’
1. 调用toString()方法;
2. 调用valueOf()方法 ;
3. 报错;
除了Date对象外,其他对象默认为 ‘number’
四、严格模式语法和行为改变
http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html