js:js学习回顾(待补)

js学习回顾(待补)

1.变量提升

函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部:

x = 5; // 变量 x 设置为 5
elem = document.getElementById("demo"); // 查找元素 
elem.innerHTML = x;                     // 在元素中显示 x
var x; // 声明 x

变量初始化不会提升:

var x = 5; // 初始化 x
elem = document.getElementById("demo"); // 查找元素 
elem.innerHTML = x + " " + y;           // 显示 x 和 y
var y = 7; // 初始化 y(没在输出代码前赋值不能获值)

结果页面显示:x 为:5,y 为:undefined

JavaScript 严格模式(strict mode)不允许使用未声明的变量。

解析机制:
遇到 script 标签的话 js 就进行预解析,将变量 var 和 function 声明提升,但不会执行 function,然后就进入上下文执行,上下文执行还是执行预解析同样操作,直到没有 var 和 function,就开始执行上下文。

使用匿名函数的方式不存在函数提升,因为函数名称使用变量表示的,只存在变量提升。

需要注意的是,函数优先,虽然函数声明和变量声明都会被提升,但是函数会首先被提升,然后才是变量。


2.js使用注意(数据类型)

switch 语句会使用恒等计算符(===)进行比较:

var x = 10;
switch(x) {
    case "10": alert("Hello");  //不会弹窗
}

浮点型数据使用注意事项:

var x = 0.1;
var y = 0.2;
var z = x + y            // z 的结果为 0.30000000000000004
if (z == 0.3)            // 返回 false

为解决以上问题,可以用整数的乘除法来解决:

var z = (x * 10 + y * 10) / 10;       // z 的结果为 0.3

数组的索引
JavaScript 不支持使用名字来索引数组,只允许使用数字索引。php可以。
如果你使用名字作为索引,当访问数组时,JavaScript 会把数组重新定义为标准对象。
执行这样操作后,数组的方法及属性将不能再使用,否则会产生错误。

3.表单提交注意

function validateForm() {
    var x = document.forms["myForm"]["fname"].value;
    if (x == null || x == "") {
        alert("需要输入名字。");
        return false;
    }
}

<form name="myForm" action="demo_form.php" onsubmit="return validateForm()" method="post">
名字: <input type="text" name="fname">
<input type="submit" value="提交">
</form>

οnsubmit=“return validateForm()” 为什么不是 οnsubmit=“validateForm()” ?

οnsubmit=“validateForm()” 能够调用 validateForm() 对表单进行验证,但是在验证不通过的情况下,并不能阻止表单提交。

οnsubmit=“return validateForm()” 当验证不通过时,返回 false,可以阻止表单提交。

4.const和let

let 声明的变量只在 let 命令所在的代码块内有效。
const 声明一个只读的常量,一旦声明,常量的值就不能改变。
在相同的作用域或块级作用域中,不能使用 let 关键字和var 关键字互相重置声明的变量。
let 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的。
const声明的常量必须初始化,而let声明的变量不用。
使用 const 定义的对象或者数组,其实是可变的:

// 创建常量对象/数组
const car = {type:"Fiat", model:"500", color:"white"};
// 修改属性:
car.color = "red";
// 添加属性
car.owner = "Johnson";

但是我们不能对常量对象/数组重新赋值:

const car = {type:"Fiat", model:"500", color:"white"};
car = {type:"Volvo", model:"EX60", color:"red"};    // 错误

使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”:

if (true) {
  // TDZ开始
  tmp = 'abc'; // ReferenceError
  console.log(tmp); // ReferenceError

  let tmp; // TDZ结束
  console.log(tmp); // undefined

  tmp = 123;
  console.log(tmp); // 123
}

7.delete

全局变量不能通过 delete 操作符删除;而 window 属性上定义的变量可以通过 delete 删除.

var num=123;
window.str="string";

delete num;
delete str;

console.log(num); //123
console.log(str); //str is not defined

//全局变量不能通过 delete 删除,因为通过 var 定义全局变量会有一个名为 [Configurable] 的属性,默认值为 false,所以这样定义的属性不可以通过 delete 操作符删除

猜你喜欢

转载自blog.csdn.net/m0_49888984/article/details/108272066