- JavaScript 中的变量类型
JavaScript 中变量可以存储两种类型的值,即原始值和引用值。
5种原始类型:Boolean, Number, String, Null, Undefined
其中 Null 和 Undefined 这两种类型都只有一个值,分别是 null 和 undefined,undefined 表示声明了变量但是未初始化,null 表示尚未存在的对象
引用类型使用 typeof 之后都会统一返回 Object(null 也会返回 Object)
参考资料:《JavaScript 高级程序设计》 Nicholas C.Zakas 著, 曹力 张欣 等译 - Array 对象创建之后,可以灵活地改变其长度
var arr = [1, 2];
console.log(arr.length); //2
arr.length = 4; //通过设置length来扩展arr的长度
console.log(arr.length);//4
console.log(arr);// 1,2,,
arr[4] = 4; //通过直接扩展下标来扩展arr的长度
console.log(arr.length); //5
console.log(arr);// 1,2,,,4
//直接通过下标越界读取arr的内容不会引起arr扩容
console.log(arr[5]);//undefined
console.log(arr.length); //长度依然为5
- 模板字符串
能否使用需要看浏览器是否支持
var name = '小明';
var age = 20;
var message = `你好, ${name}, 你今年${age}岁了!`;
alert(message);
- Array.protype.splice()方法
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
start表示开始的下标,从0开始(-1表示倒数第一个),deleteCount表示从start开始连续删除的元素个数, item列表表示要插入的元素列表。
通过这三个参数的组合,可以对array实现包括删除,替换等丰富的操作。
当只传入一个参数的时候,表示删除从该下标开始(包含该下标)的所有元素
参考文档 - JavaScript 中的apply,call和bind
ECMAScript规范中给所有的函数都实现了 call 和 apply 两个函数,call() 接收上下文对象和一个参数列表,apply() 接收上下文对象和所有参数组成的数组,apply() 和 call() 都会立刻执行,作用包括改变 this 的指向,调用函数,???
call() 和 bind() 接收参数的方式都是一样的,区别在于 bind() 返回的是函数,不会立即执行,原来函数的上下文不会被影响。bin()也是在 EcmaScript5 中扩展的。 - JavaScript的变量提升
JavaScript 在处理函数中变量声明的时候,会先把函数内部所有声明的变量提升到函数顶部。所以我们会看到一些先使用后声明的语句情况也能够工作。但是要注意的是,虽然声明会被提升到顶部,但是赋值并不会。
'use strict'
function test() {
var x = "Today is ";
console.log(x + y); // Today is undefined
y = "Monday";
console.log(x + y); // Today is Monday
var y;
}
test();
- JavaScript 中的 this
不同于我们常见的面向对象编程语言(如java和C++),JavaScript并没有真正意义上的类。通常JavaScript 中使用的对象创建方式是通过构造函数。构造函数并不属于某一个类,而是一个普通的函数,当使用 new 标记来调用这个函数的时候,它就成为了一个能够创建对象的构造函数。
function Company(companyName, companyCode) {
this.companyName = companyName;
this.companCode = companyCode;
}
var company = new Company("google", 1001);
console.log(company); // 打印: Company { companyName: 'google', companCode: 1001 }
function mockContext() {
var company1 = new Company("facebook", 1000);
console.log(company1); // 打印:Company { companyName: 'facebook', companCode: 1000 }
Company.call(company1, "apple", 1002);
console.log(company1); // 打印:Company { companyName: 'apple', companCode: 1002 }
}
mockContext();
函数 Company() 实际上就是一个普通的函数,函数体内部的 this 指向的一直是调用该函数的对象,而这个对象会随着上下文的变化而不同。当我们使用 new 符号来调用 Company() 函数的时候,new 符号会先创建一个默认的对象(object),this 会指向这个对象。当正常使用 Company() 函数的时候,this 指向的就是调用它的那个对象
this 这么神奇的特性,实际上在编程中会带来一些问题,就是我们需要时刻注意 this 的指向。我们经常会在函数的内部看到这样一种写法:var that = this; 这就是为了在函数内部运行过程中进入到其他的对象中,this 指向发生变化之后,仍然可以通过 that 来使用原来的 this 指向的内容。
- jQuery 中的 deferred 对象
deferred 对象是为了完善 jQuery 中的异步回调机制而设计的
参考资料