/*
毒瘤
全局变量
JS所有的糟糕特性之一,最为糟糕的一个就是它对全局变量的依赖
三种方式创建全局变量:
1. 在全局作用域放置一个var语句
2. 在浏览器中,给window对象添加属性
3. 直接使用未经声明的变量,称为隐式全局变量
作用域
声明变量的最好方式是在每个函数的开头部分声明所有变量
*/
/*自动插入分号*/
console.log((function() {
return {
message: "this is a message!"
};
})());
console.log((function() {
return {
message: "this is a message!"
};
})());
//输出:
// undefined
// Object {message: "this is a message!"}
//分析:
// 第一例函数内部return语句由于分号自动补全,实际上是:
// return;
// {
// message : "this is a message!"
// };
// 所以,实际上并没有返回任何值,JS中所有函数都有返回值,如果没有明确指定,则为undefined
/*
Unicode
JS字符为16位,Unicode把一对字符视为一个单一的字符,JS认为一对字符是两个不同的字符
*/
/*
typeof
typeof null 值为 'object'
typeof /a/ 一些实现会返回'object',有些返回'function'
*/
console.log(typeof null);
console.log(typeof / ^ aaa$ / );
console.log(typeof[]);
console.log(typeof NaN);
console.log(typeof undefined);
//输出:
//object
//object
//object
//number
//undefined
/*
parseInt
这是一个把字符串转换为整数的函数,在遇到非数字时会停止解析
parseInt可以接受一个基数作为参数,建议总是加上这个基数参数
*/
console.log(parseInt("16"));
console.log(parseInt("16asdf"));
console.log(parseInt("0x16", 10));
console.log(parseInt("0x16"));
//输出:
// 16
// 16
// 0
// 22
/*
+
打算用+去做加法运算,请确保两个运算数都是整数
浮点数
浮点数计算中小数可能不够精确,整数运算就是精确的
NaN
为IEEE754中定义的一个特殊的数量值,表示的不是一个数字,但typeof NaN的结果是number
NaN不等于它自己,需要检测,使用isNaN()函数
伪数组
JS没有真正的数组
typeof [] 返回object
需要判断是否为一个数组,使用Object.prototype.toString.apply(my_value) === '[object Array]'
*/
console.log(typeof []);
console.log(Object.prototype.toString.apply([]) === '[object Array]');
//输出:
// object
// true
/*
假值
以下将被认为是假
0 Number
NaN Number
'' String
false Boolean
null Object
undefined Undefined
undefined和NaN并不是常量,他们是全局变量,可以改变它们的值,但不要这么做
*/
console.log(NaN in window);
console.log(undefined in window);
//输出:
// true
// true
/*
hasOwnProperty
一个方法,他可能会被一个不同的函数甚至一个非函数的值所替换
对象
JS的对象永远不会是一个真的空对象,它永远有原型
*/