//重复定义的变量是无效的 除非重新定义的时候也赋值了
// var aa = 'aa';
// var aa;
// console.log(aa); //aa
判断变量为undefined 可以用 if(var_name === void 0){}
null 转成数字为0 undefined转为数字的时候是NaN
//在作为判断条件转化为false的情况
//undefined null false 0 -0 NaN ""或''(空字符串)
//Number 类型会有一个最大值和最小值
//console.log(Number.MAX_VALUE);
//console.log(Number.MIN_VALUE);
//NaN不等于任何值,包括它本身。 NaN === NaN // false
//infinity 表示无穷
字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。
parseInt('8a') // 8
parseInt('12**') // 12
parseInt('12.34') // 12
parseInt('15e2') // 15
parseInt('15px') // 15
如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN
。
parseInt('abc') // NaN
parseInt('.3') // NaN
parseInt('') // NaN
parseInt('+') // NaN
parseInt('+1') // 1
所以,parseInt
的返回值只有两种可能,要么是一个十进制整数,要么是NaN
。
字符串默认只能写在一行内,分成多行将会报错。如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠。注意,反斜杠的后面必须是换行符,而不能有其他字符(比如空格),否则会报错。
var longString = 'Long \
long \
long \
string';
longString
// "Long long long string"
如果在非特殊字符前面使用反斜杠,则反斜杠会被省略 。 '\a' === 'a'
Object.keys(obj) 返回的是对象的所有的属性名组成的一个数组
delete
命令用于删除对象的属性,删除成功后返回true
。删除一个不存在的属性,delete
不报错,而且返回true,delete
命令只能删除对象本身的属性,无法删除继承的属性 PS delete 也可以删除变量 如果变量是一个用var申明的 delete返回的就是false,如果是一个全局变量没有用var申明则返回true
对象 in 查询 判断一个属性是否属于某一个对象 可以用in(包含继承的属性) 如果像查找对象自己本身的属性的话可以使用hasOwnProperty
采用函数表达式声明函数时,function
命令后面不带有函数名。如果加上函数名,该函数名只在函数体内部有效,在函数体外部无效。
var print = function x(){
console.log(typeof x);
};
x
// ReferenceError: x is not defined
print()
// function
数组的某个位置是空位,与某个位置是undefined
,是不一样的。如果是空位,使用数组的forEach
方法、for...in
结构、以及Object.keys
方法进行遍历,空位都会被跳过。如果某个位置是undefined
,遍历的时候就不会被跳过。
var arr = [1,,2]; //数组空位
console.log(arr[0]) //1
console.log(arr[1]) //undefined
arr.forEach(function(val){
console.log(val)
})
//1 2 //这样循环出来的就没有undefined了
数据类型转换
// 数值:转换后还是原来的值
Number(324) // 324
// 字符串:如果可以被解析为数值,则转换为相应的数值
Number('324') // 324
// 字符串:如果不可以被解析为数值,返回 NaN
Number('324abc') // NaN
// 空字符串转为0
Number('') // 0
// 布尔值:true 转成 1,false 转成 0
Number(true) // 1
Number(false) // 0
// undefined:转成 NaN
Number(undefined) // NaN
// null:转成0
Number(null) // 0
parseInt
逐个解析字符,而Number
函数整体转换字符串的类型。另外,parseInt
和Number
函数都会自动过滤一个字符串前导和后缀的空格。
Number
方法的参数是对象时,将返回NaN
,除非是包含单个数值的数组。
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5
Number
背后的转换规则比较复杂。
第一步,调用对象自身的valueOf
方法。如果返回原始类型的值,则直接对该值使用Number
函数,不再进行后续步骤。
第二步,如果valueOf
方法返回的还是对象,则改为调用对象自身的toString
方法。如果toString
方法返回原始类型的值,则对该值使用Number
函数,不再进行后续步骤。
第三步,如果toString
方法返回的是对象,就报错。
var obj = {x: 1};
Number(obj) // NaN
// 等同于
if (typeof obj.valueOf() === 'object') {
Number(obj.toString());
} else {
Number(obj.valueOf());
}
使用new
命令时,它后面的函数依次执行下面的步骤。
- 创建一个空对象,作为将要返回的对象实例。
- 将这个空对象的原型,指向构造函数的
prototype
属性。 - 将这个空对象赋值给函数内部的
this
关键字。 - 开始执行构造函数内部的代码。
如果构造函数内部有return
语句,而且return
后面跟着一个对象,new
命令会返回return
语句指定的对象;否则,就会不管return
语句,返回this
对象。但是,如果return
语句返回的是一个跟this
无关的新对象,new
命令会返回这个新对象,而不是this
对象。这一点需要特别引起注意。
找出数组最大元素
var a = [10, 2, 4, 15, 9];
Math.max.apply(null, a) // 15
转换类似数组的对象
Array.prototype.slice.apply({0: 1, length: 1}) // [1]
Array.prototype.slice.apply({0: 1}) // []
Array.prototype.slice.apply({0: 1, length: 2}) // [1, undefined]
Array.prototype.slice.apply({length: 1}) // [undefined]
setTimeout
还允许更多的参数。它们将依次传入推迟执行的函数
setTimeout(function (a,b) {
console.log(a + b);
}, 1000, 1, 1);
setTimeout
共有4个参数。最后那两个参数,将在1000毫秒之后回调函数执行时,作为回调函数的参数。如果回调函数是对象的方法,那么setTimeout
使得方法内部的this
关键字指向全局环境,而不是定义时所在的那个对象。
setInterval
指定的是“开始执行”之间的间隔,并不考虑每次任务执行本身所消耗的时间。因此实际上,两次执行之间的间隔会小于指定的时间。比如,setInterval
指定每 100ms 执行一次,每次执行需要 5ms,那么第一次执行结束后95毫秒,第二次执行就会开始。如果某次执行耗时特别长,比如需要105毫秒,那么它结束后,下一次执行就会立即开始。