前端基础搬运工-JavaScript基础模块
二、JavaScript基础模块
基础部分
1. JS中有哪些数据类型?
- [ ] 简单数据类型:Undefined、Null、Boolean、Number 和String。
复杂数据类型:Object
2. "==" 和 "===" 的区别?
- [ ] 前者会自动转换类型,而后者不会。
前者比较的是值,后者比较的是值和类型。
3. JS中的常用内置对象有哪些?并列举该对象的常用方法?
- [ ] 1. Arguments 函数参数集合
arguments[ ] 函数参数的数组
Arguments 一个函数的参数和其他属性
Arguments.callee 当前正在运行的函数
Arguments.length 传递给函数的参数的个数
1. Array 数组
length属性 动态获取数组长度
join() 将一个数组转成字符串。返回一个字符串。
reverse() 将数组中各元素颠倒顺序
delete运算符 只能删除数组元素的值,而所占空间还在,总长度没变(arr.length)。
shift() 删除数组中第一个元素,返回删除的那个值,并将长度减 1。
pop() 删除数组中最后一个元素,返回删除的那个值,并将长度减1。
unshift() 往数组前面添加一个或多个数组元素,长度要改变。
push() 往数组结尾添加一个或多个数组元素,长度要改变。
concat( ) 连接数组
slice( ) 返回数组的一部分
sort( ) 对数组元素进行排序
splice( ) 插入、删除或替换数组的元素
toLocaleString( ) 把数组转换成局部字符串
toString( ) 将数组转换成一个字符串
2. Boolean 布尔对象
Boolean.toString( ) 将布尔值转换成字符串
Boolean.valueOf( ) Boolean对象的布尔值
3. Error 异常对象
Error.message 可以读取的错误消息
Error.name 错误的类型
Error.toString( ) 把Error 对象转换成字符串
EvalError 在不正确使用 eval()时抛出
SyntaxError 抛出该错误用来通知语法错误
RangeError 在数字超出合法范围时抛出
ReferenceError 在读取不存在的变量时抛出
TypeError 当一个值的类型错误时,抛出该异常
URIError 由URl的编码和解码方法抛出
4. Function 函数构造器
Function 函数构造器
Function.apply( ) 将函数作为一个对象的方法调用
Function.arguments[] 传递给函数的参数
Function.call( ) 将函数作为对象的方法调用
Function.caller 调用当前函数的函数
Function.length 已声明的参数的个数
Function.prototype 对象类的原型
Function.toString( ) 把函数转换成字符串
5. Math 数学对象
Math对象是一个静态对象
Math.PI 圆周率。
Math.abs() 绝对值。
Math.ceil() 向上取整(整数加 1,小数去掉)。
Math.floor() 向下取整(直接去掉小数)。
Math.round() 四舍五入。
Math.pow(x,y) 求 x的y次方。
Math.sqrt() 求平方根。
6. Number 数值对象
Number.MAX_VALUE 最大数值
Number.MIN_VALUE 最小数值
Number.NaN 特殊的非数字值
Number.NEGATIVE_INFINITY 负无穷大
Number.POSITIVE_INFINITY 正无穷大
Number.toExponential( ) 用指数计数法格式化数字
Number.toFixed( ) 采用定点计数法格式化数字
Number.toLocaleString( ) 把数字转换成本地格式的字符串
Number.toPrecision( ) 格式化数字的有效位
Number.toString( ) 将—个数字转换成字符串
Number.valueOf( ) 返回原始数值
7. Object 基础对象
Object 含有所有 JavaScript 对象的特性的超类
Object.constructor 对象的构造函数
Object.hasOwnProperty( ) 检查属性是否被继承
Object.isPrototypeOf( ) 一个对象是否是另一个对象的原型
Object.propertyIsEnumerable( ) 是否可以通过 for/in循环看到属性
Object.toLocaleString( ) 返回对象的本地字符串表示
Object.toString( ) 定义一个对象的字符串表示
Object.valueOf( ) 指定对象的原始值
8. RegExp 正则表达式对象
RegExp.exec( ) 通用的匹配模式
RegExp.global 正则表达式是否全局匹配
RegExp.ignoreCase 正则表达式是否区分大小写
RegExp.lastIndex 下次匹配的起始位置
RegExp.source 正则表达式的文本
RegExp.test( ) 检测一个字符串是否匹配某个模式
RegExp.toString( ) 把正则表达式转换成字符串
9. String 字符串对象
Length 获取字符串的长度。
toLowerCase() 将字符串中的字母转成全小写。
toUpperCase() 将字符串中的字母转成全大写。
charAt(index) 返回指定下标位置的一个字符。如果没有找到,则返回空字符串。
substr() 在原始字符串,返回一个子字符串
substring() 在原始字符串,返回一个子字符串。
split() 将一个字符串转成数组。
charCodeAt( ) 返回字符串中的第 n个字符的代码
concat( ) 连接字符串
fromCharCode( ) 从字符编码创建—个字符串
indexOf( ) 返回一个子字符串在原始字符串中的索引值(查找顺序从左往右查找)。如果没 有找到,则返回-1。
lastIndexOf( ) 从后向前检索一个字符串
localeCompare( ) 用本地特定的顺序来比较两个字符串
match( ) 找到一个或多个正则表达式的匹配
replace( ) 替换一个与正则表达式匹配的子串
search( ) 检索与正则表达式相匹配的子串
slice( ) 抽取一个子串
toLocaleLowerCase( ) 把字符串转换小写
toLocaleUpperCase( ) 将字符串转换成大写
toLowerCase( ) 将字符串转换成小写
toString( ) 返回字符串
toUpperCase( ) 将字符串转换成大写
valueOf( ) 返回字符串
4. 什么是闭包?
- [ ] 简单的说,作用域是针对变量的,比如我们创建一个函数a1,函数里面又包了一 个子函数 a2。此时就存在三个作用域: 全局作用域、a1作用域、a2 作用域;即全局作用域包含了a1的作用域,a2 的作用 域包含了 a1的作用域。 当a1 在查找变量的时候会先从自身的作用域区查找,找不到再到上一级a2 的作用域 查找,如果还没找到就到全局作用域区查找,这样就形成了一个作用域链。 理解闭包首先要理解,js 垃圾回收机制,也就是当一个函数被执行完后,其作用域会被 收回,如果形成了闭包,执行完后其作用域就不会被收回。 如果某个函数被他的父函数之外的一个变量引用,就会形成闭包。 闭包的作用,就是保存自己私有的变量,通过提供的接口(方法)给外部使用,但外部 不能直接访问该变量。
5. 什么是原型链?
- [ ] Javascript 是面向对象的,每个实例对象都有一个proto_属性,该属性指向它原 型对象,这个实例对象的构造函数有一个原型属性 prototype,与实例的proto属性指 向同一个对象。当一个对象在查找一个属性的时,自身没有就会根据proto_ 向它的原型 进行查找,如果都没有,则向它的原型的原型继续查找,直到查到 Object.prototype.proto_为null,这样也就形成了原型链。
6. 有哪些方式继承?
- [ ] 1. 借用构造函数。也叫伪造对象或经典继承。 思路:在子类构造函数的内部调用超类型构造函数。可以通过使用 apply()和call()方法 在新创建的对象上执行构造函数。 缺点:方法都在构造函数中定义,函数的复用就无从谈起。在超类型的原型中定义的方 法,对子类而言也是不可见的,结果所有的类型都只能使用构造函数模式。
2. 组合继承。也叫伪经典继承。指的是将原型链和借用构造函数的技术组合到一起, 从而发挥二者之长。 思路:使用原型链实现对原型属性属性和方法的继承,通过借用构造函数来实现实例属 性的继承。 优点:既通过在原型上定义方法实现了函数复用,又能保证每一个实例都有它自己的数 组。 组合继承避免了原型链和借用构造函数的缺陷,融合了他们的优点,成为 JavaScript 中常用的继承模式。
3. 原型链继承。 思路:借助原型可以基于已有的对象创建对象,同时还不必因此创建自定义类型。 在object()函数内部,先创建一个临时的构造函数,然后将传入的对象作为这个构造函 数的原型,最后返回了这个临时类型的一个新实例。
4. 寄生式继承。 思路:创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最 后再像真的是它做了所有的工作一样返回对象。缺点:使用寄生式继承来为对象添加函数,会由于不能做到函数复用二降低效率,这一 点和构造函数模式类似。
5. )寄生组合式继承。是JavaScript 最常用的继承模式。 思路:通过借用构造函数来继承属性,通过原型链的混成形式来继承方法。 本质上,就是使用寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型。 开发人员普遍认为寄生组合式继承时引用类型最理想的继承范式。 extend()方法才用了这样的方式。
7. 字符创的常用方法有哪些?
- [ ] charCodeAt 方法返回一个整数,代表指定位置字符的 Unicode 编码;
charAt方法返回指定索引位置处的字符。如果超出有效范围的索引值返回空字符串;
slice方法返回字符串的片段;
substring方法返回位于String 对象中指定位置的子字符串。
substr方法返回一个从指定位置开始的指定长度的子字符串。
indexOf方法返回 String 对象内第一次出现子字符串位置。如果没有找到子字符串, 则返回-1;
lastIndexOf方法返回 String对象中字符串最后出现的位置。如果没有匹配到子字符 串,则返回-1;
search方法返回与正则表达式查找内容匹配的第一个字符串的位置。
concat 方法返回字符串值,该值包含了两个或多个提供的字符串的连接;
split 将一个字符串分割为子字符串,然后将结果作为字符串数组返回;
8. DOM节点的增删改查?
- [ ] 1. 创建节点、追加节点
createElement(标签名)创建一个元素节点(具体的一个元素)。
createTextNode(节点文本内容)创建一个文本节点。
createDocumentFragment() //创建一个 DOM 片段。
appendChild(节点)追加一个节点。
2. 插入节点
appendChild(节点)也是一种插入节点的方式,还可以添加已经存在的元素,会将其
元素从原来的位置移到新的位置。
insertBefore(a,b)是参照节点,意思是 a节点会插入 b节点的前面。
3. 删除、移除节点
removeChild(节点) 删除一个节点,用于移除删除一个参数(节点)。其返回的被移除
的节点,被移除的节点仍在文档中,只是文档中已没有其位置了。
4. 复制节点
cloneNode() 方法,用于复制节点, 接受一个布尔值参数, true 表示深复制(复制节点
及其所有子节点), false 表示浅复制(复制节点本身,不复制子节点)。
5. 替换节点
replaceChild(插入的节点,被替换的节点) ,用于替换节点,接受两个参数,第一参数
是要插入的节点,第二个是要被替换的节点。返回的是被替换的节点。
6. 查找节点
getElementsByTagName() //通过标签名称
getElementsByName() //通过元素的Name 属性的值(IE容错能力较强,会得到一
个数组,其中包括 id等于 name值的)
getElementById() //通过元素 Id,唯一性
9. 什么是预解析?
- [ ] 在代码整体执行之前,先解析一部分。
预解析之后,代码才会从上往下依次整体执行,但是预解析执行过的代码不会 重复执行。
js预解析干了什么事:js 中预解析会把声明部分的代码预先执行。
声明相关的代码可以分为两部分:
1、 变量声明 通过 var关键字定义的变量。
2、函数声明 通过 function关键字声明的函数
预解析时如果遇到重复的变量声明,那么忽略。
预解析时如果遇到重复的函数声明,保留后面的函数。
预解析时如果遇到变量与函数重名的情况,保留函数。
10. 什么是变量名提升?
- [ ] 使用 var关键字定义的变量,被称为变量声明;
函数声明提升的特点是,在函数声明的前面,可以调用这个函数。
11. JS中的typeof关键字能返回哪些数据类型?
- [ ] typeof一般判断基本数据类型。是一个操作符而不是函数,圆括号可有可无。
typeof 返回值有:string,number,boolean,undefined,object ,function,
基本数据类型:Boolean、Number、String、Undefined、Null
基本数据类型中数字,字符串,布尔类型返回其对类型 undefined返回 undefined
九大内置构造函数及其他所有函数返回function;
其他所有复杂类型对象和null返回 object
12. 简述创建函数的几种方式?
- [ ] 1. 函数声明
function sum1(num1,num2){
return num1+num2;
}
2. 函数表达式
var sum2 = function(num1,num2){
return num1+num2;
}
3. 函数对象方式
var sum3 = new Function("num1","num2","return num1+num2");
13. 代码实现数组排序并去重
function fn(arr){
for(var i = 0; i < arr.length-1; i++){
for(var j = 0; j < arr.length-1-i; j++){
if(arr[j]<arr[j+1]){
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for(var k = 0; k < arr.length; k++){
var c = arr[k];
for(var l = k+1; l < arr.length; l++){
if(arr[l] == c){
arr.splice(l, 1);
l--;
}
}
}
return arr
}
var arr = [1, 2, 5, 6, 8, 9, 10, 6, 5, 7, 4, 3, 5]
console.log(fn(arr))
14.写出下面代码输出的结果
A. console.log( undefined || 1 ); --> 1
B. console.log( null || NaN ); --> NaN
C. console.log( 0 && 1 ); --> 0
D. console.log( 0 && 1 || 0 ); --> 0
1. 下列代码将会输出什么?
var foo = 1;
function fn() {
console.log( foo ); --> undefined
var foo = 2;
console.log( foo ); --> 2
}
fn();
实际工作部分
1. 什么是短路表达式?
- [ ] 短路表达式只是一种简写形式,也就是用 && 和 || 来赋值或者执行函数的形式
例如:
var foo = foo1 || foo2;
意思是如果foo1是真的,那么就把foo1的值赋给foo,否则把foo2的值赋给foo。
foo && foo()
当foo存在的时候,我们就执行foo函数,如果这个时候foo不是一个函数,就会报错,所以这个只是一种简写形式而已。
2. 控制台中使用哪些部分调试?
- [ ] 主要用console来进行调试
1. console.log 用于输出普通信息
2. console.info 用于输出提示性信息
3. console.error用于输出错误信息
4. console.warn用于输出警示信息
5. console.debug用于输出调试信息