1、break和continue区别
break语句用于跳出代码块或循环;
continue语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。
2、JavaScript共有六种数据类型,分别是
- 数值(number)
- 字符串(string)
- 布尔值(boolean)
- undefined
- null
对象(object)
ES6又新增了第七种Symbol类型。
3、typeof 运算符可以返回一个值的数据类型。
typeof 可以用来检查一个没有声明的变量,而不报错。在实际编程中,这个特点通常用在判断语句。
//错误的写法
if(v){
}
//ReferenceError: v is not defined
//正确的写法
if(typeof v === 'undefined'){
//
}
4、Base64转码
所谓Base64就是一种编码方法,可以将任意值转成0~9,A~Z,a-z,+和/这64个字符组成的可打印字符。使用它的主要目的,不是为了加密,而是为了不出现特殊字符,简化程序的处理。
JavaScript提供了两个Base64相关的方法。
- btoa():任意值转为Base64编码
- atob():Base64编码转为原来的值
var string = 'hello world'
btoa(string) //"aGVsbG8gd29ybGQ="
atob('aGVsbG8gd29ybGQ=') //"hello world"
5、闭包
理解闭包,首先必须理解变量作用域。javascript有两种作用域:全局作用域和
函数作用域。函数内部可以直接读取全局变量。
var n = 999;
function f1(){
console.log(n);
}
f1() //999
上面代码中,函数f1可以读取全局变量n。
但是函数外部无法读取函数内部声明的变量。
function f1(){
var n = 999;
}
console.log(n); //Uncaught ReferenceError: n is not defined
如果出于种种原因,需要得到函数内部的局部变量。正常情况下,这是办不到的,只有通过变通方法才能实现。那就是在函数的内部,再定义一个函数。
function f1(){
var n = 999;
function f2(){
console.log(n);
}
return f2;
}
var result = f1();
result();
闭包就是函数f2,即能够读取其他函数内部变量的函数。
闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。下面是一个例子,闭包使得内部变量记住上一次调用时的运算结果。
function inc(start){
return function(){
return start++;
}
}
var res = inc(5);
console.log(res()); //5
console.log(res()); //6
console.log(res()); //7
注意:使用闭包内存消耗很大,所以不能滥用闭包。
6、异或运算符
异或运算(^)在两个二进制位不同时返回1,相同时返回0。
使用异或运算可以在不引入临时变量的前提下,互换两个变量的值。
var num1 = 99;
var num2 = 100;
num1 ^= num2;
num2 ^= num1;
num1 ^= num2;
num1 //100
num2 //99
这是互换两个变量的值的最快方法。
7、JavaScript对象
7.1继承机制的设计思想就是,原型对象的所有的属性和方法,都能被实例对象共享。
function Animal(name){
this.name = name;
}
Animal.prototype.color = 'white';
var cat1 = new Animal('大毛');
var cat2 = new Animal('二毛');
console.log(cat1.color);
console.log(cat2.color);
上面代码中,构造函数Animal的prototype属性,就是实例对象cat1和cat2的原型对象。原型对象上添加一个color属性,结果,实例对象都共享了该属性。如果实例对象自身就有某个属性或方法,它就不会再去原型对象寻找这个属性或方法。
7.2 Object对象的相关方法
- Object.getPrototypeOf()
Object.getPrototypeOf()返回参数对象的原型 - Object.setPrototypeOf()
Object.setPrototypeOf() 为参数对象设置原型,返回该参数对象。它接受两个参数,第一个是现有对象,第二个是原型对象。
var a = {};
var b = {x:1};
Object.setPrototypeOf(a,b);
console.log(Object.getPrototypeOf(a) === b); //true
console.log(a.x); //1
- Object.create()
该方法接受一个对象作为参数,然后以它为原型,返回一个实例对象。该实例完全继承原型对象的属性。
// 原型对象
var A = {
print: function () {
console.log('hello');
}
};
// 实例对象
var B = Object.create(A);
Object.getPrototypeOf(B) === A // true
B.print() // hello
B.print === A.print // true
Object.prototype.isPrototypeOf()
实例对象的isPrototypeOf方法,用来判断该对象是否为参数对象的原型。
Object.getOwnPropertyNames()
Object.getOwnPropertyNames方法返回一个数组,成员是参数对象本身的所有属性的键名,不包含继承的属性键名。
Object.getOwnPropertyNames(Date)
// ["length", "name", "prototype", "now", "parse", "UTC"]
Object.getOwnPropertyNames方法返回所有键名,不管是否可以遍历。只获取那些可以遍历的属性,使用Object.keys方法
- Object.prototype.hasOwnProperty()
对象实例的hasOwnProperty方法返回一个布尔值,用于判断某个属性定义在对象自身,还是定义在原型链上。
Date.hasOwnProperty('length') // true
Date.hasOwnProperty('toString') // false