记录一些有意思的问题

字面量(数组字面量,对象字面量,字符串字面量,函数字面量)

我们都知道在JS中,除了六种基本数据类型,其余全部都是属于对象,那么我们创建一个对象的过程如下

1
2
3
4
5
var obj=new Object()
obj.a='aaa';
obj.b='bbb'
obj.c='ccc'
obj.c//"ccc"

但是我们大部分情况下不用这种方式创建对象,我们用这个方式

1
2
3
4
5
6
var obj = {
a:'aaa',//a是属性,'aaa'是属性值
b:'bbb',
c:'ccc'
}
obj.c//"ccc"

我们在创建数组,对象,字符串,函数的时候不需要用new操作符

它省略了构造函数传参初始化这一过程,带来的缺点就是初始化的值都是一致的,(每个实例对象没有自己的特性)

内置对象

内置对象

关联数组

1
2
3
4
5
6
7
var arr=new Array();
arr["china"]="beijing,niaoling,hulan";
arr["usa"]="newyork,washington,atlanta";
arr["japan"]="tokyo";
alert(arr["china"]);
alert(arr["japan"]);
alert(arr[0]);

注意上面的alert(arr[0]);这一句,它会返回undifined。这就意味着,关联数组中,不能再以传统的下标方式来访问数组元素而必须通过元素的名字。

这种通过名字来访问数组元素的形式有可读性高,灵活方便的优势。

apply,bind的黑魔法

如果一个数组我们已知里面全都是数字,想要知道最大的那个数,由于Array没有max方法,Math对象上有

我们可以根据apply传递参数的特性将这个数组当成参数传入

最终Math.max函数调用的时候会将apply的数组里面的参数一个一个传入,恰好符合Math.max的参数传递方式

这样变相的实现了数组的max方法。min方法也同理

1
2
3
const arr = [1,2,3,4,5,6]
const max = Math.max.apply(null, arr)
console.log(max) // 6

如果你想将某个函数绑定新的this指向并且固定先传入几个变量可以在绑定的时候就传入,之后调用新函数传入的参数都会排在之后

1
2
3
4
const obj = {}
function test(...args) {console.log(args)}
const newFn = test.bind(obj, '静态参数1', '静态参数2')
newFn('动态参数3', '动态参数4')

当我们使用一个函数需要改变this指向的时候才会用到call apply bind

0%