layout | title | |
---|---|---|
default |
|
首先他是弱类型,虽然不会在编辑阶段就能发现一些问题,但是他自由,并且不用应付类型系统来得到想要的行为。
对象字面量表示法:通过列出对象的组成就能被创建,是JSON的灵感来源。
他的原型继承也是争议很大。
主要是他基本都被挂载在全局对象上,共用一个公共命名空间其实是非常大的罪。
-
注释是有两种,一种是/* */的块注释,一种是//,注意块注释可能会有问题,因为在正则中可能会导致块注释提前失效了
-
注意字符串是不可变的,一旦被创建永远无法被改变,所以只能不断的创建新的字符串。
-
数字,字符串和布尔值貌似对象,因为他们拥有方法,但是他们是不可变的。
JS中的对象是可变的键控集合!!
-
对象的属性名可以是
空字符串
!!但是这些不合法的或者保留字的只能用引号括起来才行。
我们一般赋值可以用 || 来设置默认值,用 && 运算符来避免错误,比如:
var a = a.b || "";
var s = s.aa && s.aa.b;//这样即便aa是undefined也不会报错了
- 对象是通过引用来传递的,所以他们永远不会自动被复制。
这里的Object.create的写法其实很简单
Object.create = function(o){
var F = function(){}
F.prototype = o;
return new F();
}
我们可以通过hasOwnProperty来检测对象独有的属性。
创建一个函数的时候,其实会附加两个隐藏属性,一个是上下文,一个是实现函数行为的代码。
调用函数的时候,可以理解为调用函数的"调用"属性。
有四种调用方法的模式
就是说函数作为对象的一个属性,那么我们称之为一个方法。如果我们的表达式包含一个提取属性的动作,比如点操作,就被当做一个方法调用。这里毫无疑问,this代表了调用的那个对象。
函数并非是一个对象的属性来调用的时候,就是当做一个函数来调用的,此时的this就是全局对象。浏览器下面是window
var aa = {
b:function(){
console.log(this);
}
}
aa.b();//{}
var c = aa.b;
c();//window
(aa.b)();//{}
//当然,这里的执行顺序没有变化,因为.的级别只低于圆括号,高于函数调用。
我们使用new来通过构造器调用模式的时候,里面的this是新对象。同时,如果从原型对象上继承的方法来使用this,还是会是新对象,因为虽然方法是继承来的,但是还是在新对象上调用的。
function aa(){
this.status=1;
}
aa.prototype.status = 2;
aa.prototype.getStatus = function(){
console.log(this.status)
}
new aa().getStatus()//1
就是简单的改变this
function add(a,b,c){
return a+b+c;
}
var a=[1,2,3]
add.apply(null,a);//6
当我们用bind方法绑定了this之后,再赋值给一个变量。作为上面的函数调用的结果的this指针指向哪里?
答案是指向bind过的对象。
而且bind过的对象再bind就没有效果了,被锁住了,语法糖而已。
我们可以通过arguments来访问函数的所有参数,但是arguments并不是一个真的数组,他只是一个“类似数组”的对象,拥有一个length属性,但没有任何数组的方法。当然我们可以使用Array.prototype.reverse.call来调用。
这里的递归算法得抽空好好看一看。//tudo
JS没有块级作用域,但是它有函数作用域。ES6的let申明实现了块级作用域。
我们在调用了某个函数的时候,他返回的值也是一个子函数,这个子函数就拥有了访问原函数的变量的能力,这就是闭包。
闭包正常使用并不会有内存问题!!!但是在IE里面会有些内存问题。
tudo
我们可以使用函数和闭包来构建模块。(模块就是一个提供接口,但是却隐藏了状态与实现的函数或对象。)通过模块的写法,我们可以很好的减少全局变量的使用。
var aa = function(){
var inner = 'ss';
return function(){
console.log(inner);
}
}();
如上,最后的()调用是精彩之处,inner这个变量只有返回的那个函数可以访问得到,
这就是模块模式的一般形式,定义了私有变量和函数的函数,然互利用闭包创建一个可以访问私有变量和函数的特权函数。
也可以产生安全的对象,如下:
var sss = function(){
var name = '11';
return {
setName:function(a){
name = a;
},
getName:function(){
return name;
}
}
}
//返回的对象拥有对于属性进行修改的方法,即使我们改变这个对象的方法,我们仍然不能访问到那些属性了!!
就是在函数的最后返回this,我们可以设置或者修改对象的状态,可以给全能的端口降降温,一个接口要做的事情就是比较少了。
柯里化实际上函数式编程的思想,是函数能够部分执行。我们在JS中可以使用闭包来实现保存住一定的参数而已,使用bind也可以。
具体实现就是将一个接受多个参数的函数转化为一个接受了一个函数,然后返回一个接受剩下参数的函数。
在写bind的polyfill的时候其实就已经写了一个柯里化参数了。
这是件蛮有意思的事情,就是如果看出了一些重复的没有意义的调用,我们可以在函数中使用一些数组之类的东西来减少运行的次数,来存储上次的结果。