
js声明变量使用var和不用var的区别,大部分我们使用的时候都是一样的,例如:
而在使用delete属性时,使用var的变量是不允许删除的,例如:
八、JS的局部变量提升和块级作用域
先来看代码执行的结果(也是一道经典的js面试题):
这是什么原因造成的?为什么不是global/local/global呢?因为es5没有块级作用域,局部变量被提升到最前了声明了,js解析器的机制造成的,上面的代码类似于下面这段代码:
所以通常来说,在作用域里面变量声明的代码要放在代码的最顶部,这是一个非常不错的编程习惯,也可以避免一些不必要的问题。
九、特殊的Date类型转换
如果我告诉你typeof(new Date()+1)和typeof(new Date-1)的值不同你信吗?
下面来看具体代码:
那上面的问题是怎么造成的,typeof(now+1)不应该是number类型吗?
原因分析:
“+” 有两种含义,一个是字符串连接,一个是加法。
类型转换的时候,默认先调用valueOf,然后才调用toString,而Date类型除外,所以对于new Date()的时候优先,调用的是toString(),而“+”操作是把他当成了字符串连接而不是数字相加。js sort排序
“-”的时候,只有减法的含义,也就是说优先调用valuleOf,所以结果为number类
十、js的继承机制
继承机制:js是通过原型链实现继承的。简单实现如下:
更多的可以查看阮一峰老师的:
十一、Array的高级用法
1.slice和splice区别
虽然都是截取数组然而slice和splice的区别很大,接下来具体来看。
先说slice
slice定义:方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。原始数组不会被修改。
Array.prototype.slice(x,y); 第一位参数为截取开始下标,截取的时候包含此下标,第二位参数缺省参数,如果不填写,标识截取到数组的最后一位,如果填写了,标识截取到下标的位置,截取元素不包含最后一位,截取不改变原来数组。
小技巧:可以使用var newArray =array.splice();实现数组复制。
2.length的另一种用法

3.reduce()
定义:方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值。
4.every()和some()
定义:数组的逻辑判断,对每一个元素进行判断,返回true或者false.
every()每一个元素都要满足条件才会返回true,some()其中一项满足条件即会为true.
5.map()
定义:将调用数组的每一个元素传递给指定的函数,并返回一个新的数组,不会改变老数组。
6.Arguments.callee
定义:当前正在执行的函数.
在匿名函数中使用Arguments.callee引用自身,以便实现递归。代码如下:
7.sort()排序规则的理解
sort()是可以介绍一个匿名函数作为排序规则的,例如:
理解:a-b得到一个值,而这个正常的值将按照数字的正常规则进行排序,也就是 负数=>0=>正数,所以理解a-b不能单纯的理解他为一个boolean值,而是根据a-b给数组一个排序规则,如果需要倒叙的话就用b-a.
十二、高阶函数
定义:高阶函数就是操作函数的函数,它接受一个或多个作为参数,并返回一个新函数。
十三、正则表达式字符
[...] 方块内任意字符
[^...] 非方块内任意字符
\w [a-zA-Z0-9]
\W [^a-zA-Z0-9]
\d [0-9]
\D [^0-9]
十四、解构赋值
十五、闭包
“闭包”这个词刚开始开的时候就头皮发麻,感觉很“高大上”难以理解,其实掌握之后,发现也挺好用的,下面介绍一下我对于闭包的理解。
定义:闭包就是可以访问一个函数局部(私有)变量的方法。
如上代码:利用闭包可以给用特权的方法访问私有属性,保证了私有变量不被修改和污染,当然根据实际需求可以设置通过方法修改私有属性也是可行的。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-64292-2.html
阿斗还是阿斗
不爆炸是因为是穿甲弹
觉着生活还不如以前
脸皮可真厚