1、JavaScript 的基本类型有哪些?引用类型有哪些?null 和undefined 的区别?
数据类型
基本数据类型:Number、String、Boolean、null、undefined
引用数据类型:Function、Object、Array
区别
undefined:表示变量声明但未赋值
null:表示没有没有对象
2、简述创建函数的几种方式?
第一种(函数声明)
第二种(函数表达式)
第三种(函数对象方式)
3、Javascript 创建对象的几种方式?
-
简单对象的创建 使用对象字面量的方式{} 创建一个对象
-
用 function(函数)来模拟 class
-
使用工厂方式来创建(Object 关键字)
-
使用原型对象的方式 prototype 关键字
-
动态原型的方式
4、请指出 JavaScript 宿主对象和原生对象的区别?
原生对象是独立于宿主环境的ECMAScript实现提供的对象
宿主对象是由ECMAScript实现的宿主环境提供的对象,所有非原生对象都是宿主对象。
5、JavaScript 内置的常用对象有哪些?
Array 数组
length 属性 动态获取数组长度
join() 将一个数组转成字符串。返回一个字符串。
reverse() 将数组中各元素颠倒顺序等
String 字符串对象
Length 获取字符串的长度。
substr() 在原始字符串,返回一个子字符串 等
Boolean 布尔对象
Boolean.toString( ) 将布尔值转换成字符串
Boolean.valueOf( ) Boolean 对象的布尔值
Date 日期时间,Error 异常对象 ,Number 数值对象 ,Math 数学对象 ,Object 基础对象
6、JavaScript 中什么情况下会返回 undefined 值?
-
访问声明,但是没有初始化的变量
-
访问不存在的属性
-
定义了形参,没有传实参
-
访问任何被设置为 undefined 值的变量
-
写了return,但没有赋值
-
函数没有写返回值,即没有写return
7、怎么判断两个对象相等?
遍历对象的所有键名和键值是否都一致
-
判断两个对象是否指向同一内存
-
使用 Object.getOwnPropertyNames 获取对象所有键名数组
-
判断两个对象的键名数组是否相等
-
遍历键名,判断键值是否都相等
8、如何遍历对象的属性?
-
for...in
循环遍历对象自身的和继承的可枚举属性该方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中的属性名的排列顺序和使用 for..in 遍历该对象时返回的顺序一致(两者的区别是 for ..in 还会枚举其原型链上的属性 )
-
Object.keys
返回一个数组,包括对象自身的(不含继承的)所有可枚举属性的键名。该方法返回一个由指定对象的所有自身属性组成的数组
9、JavaScript 中的作用域、预解析与变量声明提升?
作用域
就是变量的有效范围。 在一定的空间里可以对数据进行读写操作,这个空间就是数据的作用域
1、全局作用域: 最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的;
2、局部作用域: 局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的,最常见的例如函数内部。在 ES6 之前,只有函数可以划分变量的作用域,所以在函数的外面无法访问函数内的变量
3、块级作用域:凡是代码块就可以划分变量的作用域,这种作用域的规则就叫块级作用域
预解析
JavaScript 代码的执行是由浏览器中的 JavaScript 解析器来执行的。JavaScript 解析器执行 JavaScript 代码的时候,分为两个过程:预解析过程和代码执行过程
预解析过程:
1.把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值
2.把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用
3.先提升 function,在提升 var
变量提升
变量提升:定义变量的时候,变量的声明会被提升到作用域的最上面,变量的赋值不会提升
函数提升:JavaScript 解析器首先会把当前作用域的函数声明提前到整个作用域的最前面
变量声明提升:
使用 var 关键字定义的变量,被称为变量声明;
函数声明提升的特点是,在函数声明的前面,可以调用这个函数
10、变量提升与函数提升的区别?
变量提升
简单说就是在 JavaScript 代码执行前引擎会先进行预编译,预编译期间会将变量声明与函 数声明提升至其对应作用域的最顶端,函数内声明的变量只会提升至该函数作用域最顶层
当函数内部定义的一个变量与外部相同时,那么函数体内的这个变量就会被上升到最顶端
函数提升
函数提升只会提升函数声明式写法,函数表达式的写法不存在函数提升
函数提升的优先级大于变量提升的优先级,即函数提升在变量提升之