您的位置:首页 > Web前端 > JavaScript

JavaScript深入学习[1]

2017-09-20 23:04 246 查看

一、语句与表达式

{ 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

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: