1、javascript的发展历程
有三个版本的javascript:一是网景公司的JavaScript、二是IE中的JScript、三是CEnvi的ScriptEase。最后ECMA实现了标准化ECMA-262,作为各大浏览器JavaScript实现的基础。
2、Javascript的组成
ECMAScript
DOM(文档对象模型)
BOM(浏览器对象模型)
3、变量可以存放的两种类型,使用哪种存储结构进行存储
原始值——存储在栈中的简单数据段,它们的值存放在变量直接访问的位置
引用值——存储在堆中的对象,存储在变量处的值是一个指针,指向存储对象的内存处
4、原始类型和引用类型分别有哪些,各自使用typeof的返回值是什么?
原始类型——string、number、boolean、undefined、null
引用类型——array、object、function(function也是对象)
typeof | result |
string | string |
number | number |
boolean | boolean |
undefined | undefined |
null | object |
object | |
function | function |
5、什么时候会有undefined值?undefined的值有什么特性?
- 声明的变量未初始化
- 未定义的变量
- 当函数无返回值时,返回的值也是undefined
值为undefined的变量不能使用运算符
6、什么时候会有null值?null值有什么特性?
值undefined实际是从null派生而来的,从而
console.log(null == undefined); // 输出true
7、number有什么特殊值?用于判别特殊值的方法有哪些?
Number.MAX_VALUE、Number.MIN_VALUE、大于最大值为Number.POSITIVE_INFINITY(Infinity)、大于最小值为Number.NEGATIVE_INFINITY(-infinity)、NaN(非数字)
isFinit():判断是否为有穷数
isNaN():判断是否是数字
8、强制类型转换为Boolean类型,哪些为false?
空字符串、+0和-0和NaN、undefined、null、false
9、强制类型转换为Number类型,有哪些特殊例子?
var num1 = Number(false);
var num2 = Number(true);
var num3 = Number(undefined);
var num4 = Number(null);
console.log(num1); // 0
console.log(num2); // 1
console.log(num3); // NaN
console.log(num4); // 0
10、解释一下原型
假若现在有一个对象a,b是a的一个对象实例,那么原型指的是对象a中用于实例b进行初始化的属性或方法。在javascript中,a的这些属性存放在a.prototype里面,可以通过a.prototype.你要定义的属性来进行原型编辑,b实例的一个私有属性__proto__是用来存放a.prototype里面的原型备份。当b实例进行a对象里面的属性或者方法调用时,先检查b实例是否存在该属性或方法,若不存在,则在__proto__里面进行查找。这种机制是ECMAScript实现的。
11、为什么少使用Boolean类?
Boolean类是boolean原始类型的引用类型,若使用Boolean对象进行逻辑运算,对象会自动转换为true。可以使用valueOf()返回原始值,如下:
var bflag1 = new Boolean(false);
console.log(bflag1 && true); // true
var bflag1 = new Boolean(false);
console.log((bflag1.valueOf()) && true); // false
12、slice()和substring()方法有什么不同?
正数参数两个方法一样,第一个参数是起始位置,第二个参数是终止位置。
负数参数,slice()会用字符串的长度加上参数,substring()会视之为0。例如:
var str = '01234567';
console.log(str.slice(-2)); // 67
console.log(str.substring(-2)); // 01234567
console.log(str.slice(2,-2)); // 2345
console.log(str.substring(2,-2)); //01
13、this的用法
若使用对象.函数()这样调用函数,对象中的函数的this指代对象本身
// 例子1
var obj = {
color : 'blue',
showColor : function() {
return this.color; // 这里的this指代obj
}
};
console.log(obj.showColor()); // blue
- 顶层函数里面的this
- 对象的函数里面的函数的this
指代的是global(在浏览器的宿主环境中,取而代之的是window)
// 例子2
function getColor() {
console.log(this == global); // true
}
getColor();
// 例子3
global.color = 'red';
var obj = {
color : 'blue',
showColor : function() {
var getColor = function() {
console.log(global == this); // true
return this.color; // this指代global
}
return getColor();
}
};
console.log(obj.showColor()); // red
在全局定义的this
- 指代module.exports(nodejs)
- 指代window(浏览器)
// 例子4
this.num = 123;
console.log(module.exports.num); // 123
在构造函数中this指向的是它的实例
// 例子5
function Fn(){
this.num = 998;
}
var fn = new Fn();
console.log(fn.num); //998
14、运算符有哪些
一元运算符:delete、void、自增/自减、正负号
位运算符:NOT(用~表示,运算是对数字求负,然后减1)、AND、OR、XOR(用^表示,异或)、左移(后边补0)、有符号右移(左边补符号位)、无符号右移(左边补0)
逻辑运算符:NOT、AND、OR
算术运算符:+、-、*、/、%
关系运算符:<、>、<=、>=、==、===、!=、!==(等和全等差别在于是否进行前置类型转换)
三元运算符(条件运算符): condition ? true_value : false_value
赋值运算符:=、*=、+=、-=、/=、%=、<<=、>>=、>>>=
逗号运算符:,
15、闭包
当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。
有一句话说得好:在 Javascript 中,如果一个对象不再被引用,那么这个对象就会被 GC 回收,否则这个对象一直会保存在内存中。有以下例子:
function A() {
var count = 0;
function B() {
count ++;
console.log(count);
}
return B;
}
var C = A();
C(); // 1
C(); // 2
C(); // 3
闭包的用途:当我们需要在模块中定义一些变量,并希望这些变量一直保存在内存中但又不会 “污染” 全局的变量时,就可以用闭包来定义这个模块。下面是闭包的高级写法:
(function (document) {
var viewport;
var obj = {
init: function(id) {
viewport = document.querySelector('#' + id);
},
addChild: function(child) {
viewport.appendChild(child);
},
removeChild: function(child) {
viewport.removeChild(child);
}
}
window.jView = obj;
})(document);
16、javascript中怎样实现对象废除
把对象的引用都设置为null
17、对象类型有哪几种
(独立于宿主环境的、ECMA-262定义的类)本地对象:Boolean、Number、String、Object、Array、Function、Date、RegExp和其他Error
内置对象:Global
宿主对象:DOM、BOM
D18、怎样声明和初始化数组
使用引用类型
// 方法1
var array = new Array()
array[0] = 'red';
array[1] = 'blue';
array[2] = 'green';
// 方法2
var array = new Array('red', 'blue', 'green');
使用隐式声明
// 方法3
var array = ['red', 'blue', 'green'];
19、数组和字符串的互相转化
数组转化为字符串
var array = ['red', 'blue', 'green'];
console.log(array.toString()); // red,blue,green
console.log(array.valueOf()); // [ 'red', 'blue', 'green' ]
console.log(array.join(' | ')); // red | blue | green
字符串转化为数组
var str = 'red,blue,green';
var array = str.split(',');
console.log(array); // [ 'red', 'blue', 'green' ]
20、数组怎么实现队列
var array = ['red', 'blue', 'green'];
// 入队
var enqueue = function() {
console.log('grey入队');
array.push('grey')
}
// 出队
var dequeue = function() {
var red = array.shift();
console.log('red出队');
}
enqueue();
dequeue();
console.log(array.valueOf());
21、Date的常用方法
var d = new Date(); // 现在是2019/3/4
console.log(d.getTime()); // 1551696951664
console.log(d.getFullYear()); // 2019
console.log(d.getMonth()); // 2
console.log(d.getDate());
console.log(d.getDay());
console.log(d.getHours());
console.log(d.getMinutes());
console.log(d.getSeconds());