JavaScript深入学习[1]

来源:互联网 发布:流体力学分析软件 编辑:程序博客网 时间:2024/05/21 21:49

一、语句与表达式

{ foo: fn() }

这段代码有二义性
1. ‘foo:’可以看作标签 ,{}看做代码块,这时是语句
2.对象字面量,这时是表达式

function fn(){}

这段代码也具有二义性
1.看做函数声明(语句)
2.具名函数表达式
因此以上两端代码用eval解析时应当添加括号来作为表达式输出值

eval('({ foo : fn() })');eval('(function fn(){})');

二、分号自动插入机制(ASI)

在以下情况中会自动插入分号

1.换行符后跟非法字符

例如 :

var a = 1console.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//truetypeof 1 == "number";//truetypeof "1" == "string";//truetypeof true == "boolean";//truetypeof [] == "object";//truetypeof {} == "object";//true[] instanceof Array;//true{} instanceof Array; //true
2.真值假值

0 ,”(空字符串),false ,undefined ,null 都为假值;其余为真值;

3.== 与 ===

===为严格相等,类型不同则必定不等;

==为宽松相等,类型不同会先进行类型转换;

undefined == null0 == false0 == """" == 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

原创粉丝点击