基础
1.JavaScript都有哪些数据类型?
- 简单数据类型:undefined、null、boolean、number、string
- 复杂数据类型:Object
2.数据类型转换:
(1).隐式转换:
- 数值+字符串—>数值转换为字符串
- 数值+布尔---->布尔型转为数值型
- 字符串+布尔---->布尔转为字符串型
(2)强制类型转换
- Number()、parseInt()、parseFloat()、toString(n进制)
3.数组API
- toString() 数组转为字符串,默认用逗号连接
- join() 数组转为字符串、默认按逗号链接,可指定字符连接为字符串
- concat() 拼接多个数组
- slice(start,end) 截取数组中的元素,从start 到end前一个,负数表示倒数。
- splice(start,count,v1,v2…)start为负数表示倒数,count为空表示删除到最后,v1,v2表示删除后补充的元素。原数组发生改变
- reverse()翻转数组中的元素
- sort()对数组排序。
- push()入栈,返回数组长度
- pop()出栈,返回删除的元素
- unshift()在数组的开头添加元素,返回数组长度
- shift()删除数组开头的一个元素,返回删除的元素
4.字符串API
- length
- chartAt(n) 查找下标对应的字符
- indexOf(str) 查找某个字符串首次出现的下标,找不到返回-1
- lastIndexOf(str) 查找某个字符左后一次出现的下标,找不到返回-1
- toUpperCase() 英文字母转大写
- toLowerCase() 英文字母转小写
- slice(start,end) 截取字符串,允许使用负数表示倒数,开始下标必须小于结束下标
- substring(start,end) 截取字符串,负数自动转为0,开始下标可以大于结束下表
- split(str) 将字符串按照指定的字符切割为数组
5.Math对象
- PI 圆周率
- abs() 绝对值
- ceil() 向上取整
- floor() 向下取整
- round() 四舍五入取整
- parseInt() 去除小数点后取整
- max()
- min()
- pow(x,y) 计算x的y次方
- sqrt() 开方
- random() 取随0~1之间机数
6.什么是变量声明提前
- 当程序开始执行之前,都是在整段程序中查找var声明的变量和function声明的函数,将他们的定义提前到当前作用域的顶部集中创建,赋值留在原地。
<script>
function fun(){console.log(1);}
fun();//2
function fun(){console.log(2);}
fun();//2
var fun=100;
fun();//报错 fun is not a function
</script>
7.请指出JS宿主对象和原生对象的区别
- 宿主对象:指JavaScript解释器提供的对象,由解释器厂家自定义并提供实现,不同解释器提供的扩展对象存在较大的差异(DOM和BOM对象)。
- 原生对象:JavaScript语言本身预定义的对象,在ECMScript标准中定义,由所有的解释器厂家提供实现(Array.Date,Math,Number,String,Boolean等)。
8.js中有哪些内置函数
- Object,Array,Boolean,Number,String,Function,Date,Math,RegExp,Error,Global
9.列举出日期相关的函数
- Date.now() 返回当前日期距离计算机元年(1970/01/01 00:00:00)之间的毫秒数
- new Date() 获取当前时间 年与日时分秒
- getTime() 返回当前日期距离计算机元年(1970/01/01 00:00:00)之间的毫秒数
- getFullYear() 年
- getMounth() 月份0~11
- getDate() 日期
- getDay() 星期0~6
- getHours() 小时0~23
- getMinutes() 分钟0~59
- getSeconds 秒0~59
- getMilliseconds 毫秒0~999
10.null和undefined的区别
- undefined是访问一个未初始化的变量时返回的值
- null是访问一个上不存在的对象时返回的值
11.==
和===
的区别
==
抽象想象等,比较时先进行类型转换再比较值(隐式转换)===
严格相等,值相等同时数据类型也要相等
12.setTimeout和setInterval的区别
- 两者都是用来设置定时操作的。
- setTimeout:设置一个定时器,在定时器到期后执行一次函数或代码段。
- setInterval:设置一个定时器,以固定的时间间隔重复调用一个函数或者代码段
13.typeof操作符返回的类型有哪些?
- undefined、boolean、string、number、object、function
- 注:typeof null 返回object,因为null被认为是一个空的对象引用。
16.谈谈JavaScript垃圾回收方法
- 标记清除法(mark and sweep),是JavaScript中最常见的垃圾回收方式,当变量进入执行环境的时候,垃圾回收器会将其标记为"进入环境",当变量离开环境时,即函数执行结束时会将其标记为"离开环境"。垃圾回收器会在运行的时候给存储在内存中的变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量,在这些完成后仍存在标记的就是要删除的变量。
- 引用计数(reference counting),在低版本IE中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1,如果该变量的值变成了另外一个,则这个值得引用次数减 1,当这个值的引用次数变为 0的时候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为 0的值占用的空间。
17.ES5严格模式"use strict"
- 禁止给未声明过的变量赋值
- 静默失败升级为错误
- 普通函数调用中的this不再指向window而是undefined
- 禁用arguments.callee(是在一个函数内自动获得当前函数本身的关键词)
- 函数的参数不能有同名属性,否则报错
- 不能使用with语句
- 不能对只读属性赋值赋值,否则报错
- 不能使用前缀0表示八进制数,否则报错
- 不能删除不可删除的属性,否则报错
- 增加了保留字(protected、static、interface)
18.回调函数
函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。函数A就是回调函数。如果没有名称就是匿名回调函数。
<script>
function a(callback){
callback(1,2)
}
a(function(a,b){
console.log(a*b);
})
</script>
19.定义函数的三种方式
(1)用声明方式定义函数(会被声明提前)
- function 函数名(形参列表){
要重复使用的代码片段
return 返回值;
//return和返回值之间一定 不要加换行
}
(2)用赋值方式创建(不会让函数声明提前)
- var 函数名=functio(形参列表){
函数体;
return 返回值;
} - 揭示了函数本质:函数的本质是内存中一个引用类型的对象,函数名中保存的不是函数本身,而是函数的唯一的地址值。
(3)用new创建:
- var 函数名=new Function(“形参1”,“形参2”,…,’'函数体;return 返回值")
20.重载(overload)
- 相同函数名,不同形参列表的多个函数,在调用时,可根据传入的实参值不同,自动选择匹配的函数调用。
- 借助函数内的arguments对象获得实参值。
- arguments对象:函数内部包含的专门接收所有传入函数的实参值的类数组对象(
__proto__:
Object)。 - 根据arguments中获得实参值个数或实参值的内容、类型的不同来执行不同的代码。
21.匿名函数自调(避免产生全局变量造成全局污染)
- (function(形参变量列表){…return 返回值})(实参值列表);
22.作用域(scope)
- 全局作用域:保存着所有的全局变量,程序中任何地方都可使用。
- 函数作用域:保存着函数内声明var的变量和形参变量,只在函数内可用。 作用域链:函数对象中保存函数调用时所有可用的作用域对象的链式结构。
23.闭包:
- 外层函数的作用域对象就是闭包对象。
- 闭包形成的原因:外层函数调用后,因为内层函数引用着外层函数的作用域对象,导致外层函数的作用域对象无法释放,形成了闭包。
24.面向对象三大特点:封装、继承、多态
- 封装:创建一个对象集中保存一个事物的属性和功能。
- 继承:父对象中的成员,子对象无需重复创建就可直接使用。
- 多态:一个函数不同情况下表现出的不同状态。(重载、重写)
25.构造函数创建实例时,new做了几件事:
- 创建一个新的空对象
- 让新创建的子对象自动继承构造函数的原型对象
- 调用构造函数,传入属性值实参,还自动将构造函数中的this全都指向正在创建的新对象。
- 将新对象的地址保存到=左边的变量中。
26.重写:override
- 重写就是在子对象中定义一个和父对象中成员同名的成员,以此来覆盖父对象中同名的成员
- 比如不同对象调用tosrting返回的数据结构并不同,原理就是重写
27.自定义继承
- 子对象.
__
proto__
=新父对象() ----->有些浏览器有兼容性问题(只换一个子对象的父对象) - Object.setPrototypeOf(子对象,新父对象)---->(只换一个子对象的父对象)
- 构造函数.prototype=新父对象---->(更换所有子对象的父对象,必须在创建子对象之前)
28.保护对象
(1).保护对象属性
每个对象属性都包含四个属性:
- value:保存当前属性的属性值
- writeable:开关,控制着是否可修改当前属性值
- enumberable:控制着是否可用for in 遍历该属性,只仿for in,防不住.–半隐藏浅紫色
- configurable:控制着是否可删除当前属性,控制着是否可修改前两个开关.一旦为false,不可逆
- 只要修改前两个中的任何一个,都要同时设置configurable:false,双重保险.
要用专门的函数修改属性的开关
- 修改属型的一个开关:Object.defineProperty(对象名,“属性名”,{开关名:true或false})
- 同时修改多个属性的开关:Object.defineProperties(对象名,{属性名
:{开关:true或false},…})
(2).保护对象的结构
- 防扩展:禁止给对象添加新的属性,只仿添加,不防删除
- Object.preventExtensions(对象)
- 密封:即禁止扩展又禁止删除属性
- Object.seal(对象)
- 冻结:既禁止扩展,又禁止删除,甚至禁止修改所有属性值
- Object.freeze(对象);.
29.如果在没有构造函数的情况下,创建一个子对象继承父对象:Object.create();
<script>
var father={
deposit:11111111,
car:"minicooper"
}
var son=Object.create(father,{
sname:{
value:"Li Lei",
writable:true,
enumerable:true
},
sage:{
value:11,
writable:true,
enumberable:true
}
});
Object.seal(son);
console.log(son);
</script>
30.替换this