-
NaN 是什么
NaN虽然表示一个非数字,但一般是算术运算执行的结果,因此NaN仍是一个数值。 执行非加法运算时:只要有NaN,执行结果都是NaN。 执行加法运算时:有一个是字符串,就执行字符串拼接。 NaN永远不等于NaN。 NaN==NaN 执行结果是false。 -
== 与 === 有什么区别?
==”模糊等,意思就是在做运算判断时,只需其值相等即可,因为在运算之前会进行一个隐式转换,可以将等式两边的数值转换成相同类型,然后再进行判断。 “===”绝对等,意思就是在做运算判断时,等式两边的数值以及数据类型都必须相同。 -
console.log(1+"2") 和 console.log(1-"2") 的打印结果?
12 -1
-
请用三元运算符(问号冒号表达式)改写以下代码:
if (a > 10) { b = a; } else { b = a - 2; } a>10 ? b=a:b=a-2 -
以下代码输出的结果是?为什么?
console.log(1 + 1); //2 console.log("2" + "4"); //24 console.log(2 + "4"); //24 -
JavaScript 定义了几种数据类型?哪些是原始类型?哪些是复杂类型?null 是对象吗?
五种 number string blooean null undfind 复杂类型 数组 函数 对象 null不是对象,虽然typeof测试null打印结果为object,但是是因为,typeof判定类型是通过底层二进制数据流进行判定的,数据流前三位为0时,typeof会判定为object类型,但null因为全为0,所以会被判定为object。 -
对象类型和原始类型的不同之处?
1.基本数据类型的值不可改变,对象数据类型的值可以改变(基础数据类型 其实是新建了一个 对象是地址不变 改变堆空间的值) 2.基本数据类型复制和存储的是值,对象数据类型复制和存储的是地址(指针) 3.基本数据类型的比较是值的比较,对象数据类型的比较是地址的比较 4.回收机制不同 当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了 当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它 5.基本类型数据是值类型 使用new()方法构造出的对象是引用型 -
怎样判断“值”属于哪种类型?typeof 是否能正确判断类型?
有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String。我们都知道可以使用typeof运算符求得一个变量的类型,但是对引用类型变量却只会返回object,也就是说typeof只能正确识别基本类型值变量。 -
以下代码的输出?为什么?
console.log(a);//undfind var a = 1; console.log(b);//报错 -
break 与 continue 有什么区别?
break是直接结束整个循环 continue 是跳过本次循环 -
switch...case 语句中的 break 有什么作用?
-
forEach、map 的区别?
一个有返回值一个没有 -
写出如下知识点的代码范例:
=> if...else 的用法; => switch...case 的用法; => while 的用法; => do...while 的用法; => for 遍历数组的用法; => for...in 遍历对象的用法; => break 和 continue 的用法。 -
写一个函数,返回参数的平方和?
function sumOfSquares() { // 补全 //arguments 伪数组 不能用数组方法 var num = 0 for(var i =0;i<arguments.length;i++){ num+=arguments[i]**2 } return num } var result = sumOfSquares(2, 3, 4); var result2 = sumOfSquares(1, 3); console.log(result); // 29 console.log(result2); // 10 -
写一个函数 squireArr,其参数是一个数组,作用是把数组中的每一项变为原值的平方。
var arr = [3, 4, 6]; function squireArr(arr) { // 补全 //window.arr 全局变量的arr 也就是原数组 window.arr = arr.map(function(item){ return item*item }) } squireArr(arr); console.log(arr); // [9, 16, 36] -
数组的哪些 API 会改变原数组?
toString() 把数组转换成字符串,逗号分隔每一项
valueOf() 返回数组对象值本身
// 1 栈操作(先进后出)
push()
pop() //取出数组中的最后一项,修改length属性
// 2 队列操作(先进先出)
push()
shift() //取出数组中的第一个元素,修改length属性
unshift() //在数组最前面插入项,返回数组的长度
// 3 排序方法
reverse() //翻转数组
sort(); //即使是数组sort也是根据字符,从小到大排序
// 带参数的sort是如何实现的?
// 4 操作方法
concat() //把参数拼接到当前数组
slice() //从当前数组中截取一个新的数组,不影响原来的数组,参数start从0开始,end从1开始
splice() //删除或替换当前数组的某些项目,参数start, deleteCount, options(要替换的项目)
// 5 位置方法
indexOf()、lastIndexOf() //如果没找到返回-1
// 6 迭代方法 不会修改原数组(可选)
every()、filter()、forEach()、map()、reduce()、some() find()、findlndex()
// 7 方法将数组的所有元素连接到一个字符串中。
join()
会改变原数组的
push() 将一个或多个元素添加到末尾 返回数组长度
unshift() 将一个或多个元素添加到头部 返回数组长度
pop() 删除最后一个元素 返回删除元素
shift() 删除第一个元素 返回删除元素
sort() 数组排序 返回改变后的新数组
reverse() 颠倒数组 返回新数组
splice(a,b,c) 返回删除元素组成的数组 没有返回空数组 通过删除或替换现有元素或者原地添加新的元素来修改数组 a起始位置 b(可选)需要删除的元素个数 c(可选)需要添加的
不会改变原数组的方法
slice(起始下标,结束下标) 包前不包后 裁切 返回裁切到的新数组
concat()合并数组 返回新数组
indexOf(需要查找的元素,起始点(可选)) 查找 找到返回下标 没找到返回-1
lastIndexOf() 从后往前查
迭代数组方法
forEach(function(item,idx,array){},aaa) item(数组元素),idx(下标),array(数组本身) aaa this指向(可选)没有返回值
map() 有return 其他跟foreach相同
filter() 筛选函数,满足return条件的 满足条件元素的新数组 参数同forEach
reduce(function(prev,item,idx,array){},bbb) 累加 返回值:函数累计处理的结果 参数 prev 为 累加器 bbb为初始值 如果没有初始值 数组第一个元素为默认初始值
find()、findlndex() 可以传入三个值 find返回第一个满足条件的值 findlndex 返回下标 后续不再执行
some() every() some 有一个满足返回true every 有一个不满足就返回false
- 什么是作用域?变量可以起作用的范围 变量属于哪个作用域 和作用域链 是看声名的时候确定的 如果 有调用 只是改变调用时候的临时改变
- 什么是作用域链?
只有函数可以制造作用域结构, 那么只要是代码,就至少有一个作用域, 即全局作用域。凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。
将这样的所有的作用域列出来,可以有一个结构: 函数内指向函数外的链式结构。就称作作用域链。
- 了解 this 吗? bind/call/apply是指什么? 三个方法有什么区别?
- 什么是变量提升 var 声明的变量 会在预解析的时候 提升到 代码的最前方
- let const var 的区别
let const 没有 变量提升
let 有块级作用域
let 和const 声明的变量 不允许重复声明
const 不能改变