Javascript面试应该注意的点
NaN(Not a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。
基本数据类型:字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。6类
引用数据类型:对象(Object)、数组(Array)、函数(Function)。3类
注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。
JavaScript 变量的生命期从它们被声明的时间开始。
局部变量会在函数运行以后被删除。
全局变量会在页面关闭后被删除。
向未声明的 JavaScript 变量分配值
如果您把值赋给尚未声明的变量,该变量将被自动作为 window 的一个属性。
这条语句:
carname="Volvo";
将声明 window 的一个属性 carname。
非严格模式下给未声明变量赋值创建的全局变量,是全局对象的可配置属性,可以删除。
var var1 = 1; // 不可配置全局属性
var2 = 2; // 没有使用 var 声明,可配置全局属性
console.log(this.var1); // 1
console.log(window.var1); // 1
delete var1; // false 无法删除
console.log(var1); //1
delete var2;
console.log(delete var2); // true
console.log(var2); // 已经删除 报错变量未定义
如果在文档已完成加载后执行 document.write,整个 HTML 页面将被覆盖。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<h1>我的第一个 Web 页面</h1>
<p>我的第一个段落。</p>
<button onclick="myFunction()">点我</button>
<script>
function myFunction()
{
document.write(Date());
}
</script>
</body>
</html>
在 HTML 中, 全局变量是 window 对象: 所有数据变量都属于 window 对象。
你的全局变量,或者函数,可以覆盖 window 对象的变量或者函数。
局部变量,包括 window 对象可以覆盖全局变量和函数。
在 JavaScript 中, 对象和函数同样也是变量。全局和局部变量即便名称相同,它们也是两个不同的变量。修改其中一个,不会影响另一个的值
事件委托是: 利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行!
闭包是什么,有什么特性,对页面有什么影响
闭包就是能够读取其他函数内部变量的函数,使得函数不被GC回收,如果过多使用闭包,容易导致内存泄露
变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。
JavaScript 只有声明的变量会提升,初始化的不会。
JavaScript 严格模式(strict mode)不允许使用未声明的变量。在函数内部声明是局部作用域 (只在函数内使用严格模式):消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
对象也是一个变量。不允许删除变量或对象。不允许删除函数。不允许变量重名:不允许变量重名:不允许使用八进制:不允许使用转义字符:不允许对只读属性赋值:
"use strict";
x = {p1:10, p2:20}; // 报错 (x 未定义)
"use strict";
var x = 3.14;
delete x;
"use strict";
function x(p1, p2) {};
delete x; // 报错
"use strict";
function x(p1, p1) {}; // 报错
JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储。所有的编程语言,包括 JavaScript,对浮点型数据的精确度都很难确定:
var x = 0.1;
var y = 0.2;
var z = x + y;//0.30000000000000004
在 JavaScript 中,分号是可选的 。由于 return 是一个完整的语句,所以 JavaScript 将关闭 return 语句。| 注意:不用对 return 语句进行断行。 |
function myFunction(a) {
var
power = 10;
return
a * power;
}
//两者是一致的
function myFunction(a) {
var
power = 10;
return; // 分号结束,返回 undefined
a *
在 JavaScript 中, 对象 使用 名字作为索引。如果你使用名字作为索引,当访问数组时,JavaScript 会把数组重新定义为标准对象。执行这样操作后,数组的方法及属性将不能再使用,否则会产生错误:
循环作用域,在第一个实例中,使用了 var 关键字,它声明的变量是全局的,包括循环体内与循环体外。在第二个实例中,使用 let 关键字, 它声明的变量作用域只在循环体内,循环体外的变量不受影响
var i = 5;
for (var i = 0; i < 10; i++) {
// 一些代码...
}
// 这里输出 i 为 10
let i = 5;
for (let i = 0; i < 10; i++) {
// 一些代码...
}
// 这里输出 i 为 5
使用 let 关键字声明的全局作用域变量不属于 window 对象:不能使用 window.carName 访问变量。
使用 var 关键字声明的变量在任何地方都可以修改
var x = 2;
// x 为 2
var x = 3;
// 现在 x 为 3
在相同的作用域或块级作用域中,不能使用 let 关键字来重置 var 关键字声明的变量
var x = 2; // 合法
let x = 3; // 不合法
{
var x = 4; // 合法
let x = 5 // 不合法
}
const 用于声明一个或多个常量,声明时必须进行初始化,且初始化后值不可再修改:
// 错误写法
const PI;
PI = 3.14159265359;
// 正确写法
const PI = 3.14159265359;
const 的本质: const 定义的变量并非常量,并非不可变,它定义了一个常量引用一个值。使用 const 定义的对象或者数组,其实是可变的。下面的代码并不会报错:
// 创建常量对象
const car = {type:"Fiat", model:"500", color:"white"};
// 修改属性:
car.color = "red";
// 添加属性
car.owner = "Johnson";
void 该操作符指定要计算一个表达式但是不返回值;可以做死锚点
事件传递有两种方式:冒泡(默认)与捕获。
事件传递定义了元素事件触发的顺序。 如果你将 <p> 元素插入到 <div> 元素中,用户点击 <p> 元素, 哪个元素的 "click" 事件先被触发呢?在 冒泡 中,内部元素的事件会先被触发,然后再触发外部元素,即: <p> 元素的点击事件先触发,然后会触发 <div> 元素的点击事件。在 捕获 中,外部元素的事件会先被触发,然后才会触发内部元素的事件,即: <div> 元素的点击事件先触发 ,然后再触发 <p> 元素的点击事件。addEventListener() 方法可以指定 "useCapture" 参数来设置传递类型:addEventListener(event, function, useCapture);
<body>
<div id="div">
<p id="demo">点击</p>
</div>
</body>
<script>
document.getElementById("demo").addEventListener("click", function () {
alert("oooo", true)
});
document.getElementById("div").addEventListener("click", function () {
alert("9999")
}, true);
</script>
清除事件监听
<body>
<div id="div">
remove
</div>
<p id="demo">点击</p>
</body>
<script>
function demo() {
console.log("oooooo")
}
document.getElementById("demo").addEventListener("click", demo);
document.getElementById("div").addEventListener("click", function () {
document.getElementById("demo").removeEventListener("click", demo);
});
</script>
isNaN( )判断原理:
首先给内部Number( )进行转换,只要Number( )转换出来是数字直接为false,否则为true isNaN(“99999”)=>false ;除以0是无穷大,无穷大是一个数字:
{}是一个不完全空的对象,因为他的原型链上还有Object呢,而null就是完全空的对象,啥也没有,原型链也没有,所以null instanceof Object === false;[]就更不用说了,它的原型链上还比{}多一个Array。
所以,纯粹意义上初始化一个空对象应该用null,{}更像是初始化对象,和new一个没有key的Obejct是一样的。还有就是空数组转换成布尔类型返回的是true: