JavaScript高级程序设计基础(二)

二、语言基础

2.1语法

(简单的语法基础将在文章省略)

2.1.1严格模式

严格模式是一种不同的 JavaScript 解析和执行模型,不规范写法在这种模式下会被处理
只需在脚本开头加上"use strict"
也可以单独指定一个函数在严格模式下执行,只要把这个预处理指令放到函数体开头即可
function doSomething() { 
 "use strict"; 
 // 函数体 
}

2.1.2语句

ECMAScript 中的语句以分号结尾有助于避免内容不完整,压缩代码,提升性能

2.2变量

2.2.1var

var操作符定义的变量会成为包含它的函数的局部变量。如果在函数内省略var操作符,就会成为全局变量(不建议)

var具有声明提升,此外,可以反复多次用var声明同一个变量

2.2.2 let

let 声明的范围是块作用域,且不允许出现冗余声明。

 

 var和let区别:

var是函数作用域,let是块作用域

if (true) { 
 var name = 'Matt'; 
 console.log(name); // Matt 
} 
console.log(name); // Matt

if (true) { 
 let age = 26; 
 console.log(age); // 26 
} 
console.log(age); // ReferenceError: age 没有定义

(JavaScript 引擎会记录用于变量声明的标识符及其所在的块作用域,嵌套使用相同的标识符不会报错)

let age=26
if(true){
 let age=30;
 console.log(age)//30
}

1.暂时性死区

在let中,如果引用未声明的变量,则会抛出出 ReferenceError,并且将其称为暂时性死区

2.全局声明

与 var 关键字不同,使用 let 在全局作用域中声明的变量不会成为 window 对象的属性
 

3.条件声明

因为 let 的作用域是块,所以不可能检查前面是否已经使用 let 声明过同名变量,同时也就不可能在没有声明的情况下声明它(参考暂时性死区)

<script>  
 let age = 26; 
</script> 
<script> 
 // 假设脚本不确定页面中是否已经声明了同名变量
 // 那它可以假设还没有声明过,即age=26还未被声明过
 let age = 36; 
 // age 之前声明过,这里会报错
</script>
 

4.for循环中的let声明

在let出现之前,一直用的var声明i,则将会导致,i渗透到循环体外部

for (var i = 0; i < 5; ++i) { 
 setTimeout(() => console.log(i), 0) 
}
// 实际上会输出 5、5、5、5、5

for (let i = 0; i < 5; ++i) { 
 setTimeout(() => console.log(i), 0) 
} 
// 会输出 0、1、2、3、4

 执行超时逻辑会被放在循环结束之后,此时var则是退出循环的值:5。而如果使用let,那么每次循环都会有一个新的let,赋值分别为0,1,2,3,4

2.2.3 const

显著区别:声明变量时必须同时初始化变量

1.const后续不能修改变量,不能重复声明

2.const的作用域是块

const name='123'
if(true){
const name='11'
}
console.log(name) //123

3.const 声明的限制

const 声明的限制只适用于它指向的变量的引用。换句话说,如果 const 变量引用的是一个对象,
那么修改这个对象内部的属性并不违反 const 的限制
 
虽然for循环不能用const来声明迭代变量
但是可以将const 用于for...in和for...of,相当于每次循环都创建了一个新的const

建议使用变量声明优先级:const>let>var

2.3数据类型

ECMAScript 有 6 种简单数据类型(也称为原始类型):Undefined、Null、Boolean、Number、
String 和 Symbol。还有一种复杂数据类型叫 Object
 

2.3.1typeof

typeof 是一个操作符而不是函数
console.log(typeof '123')//string

注意:调用typeof null 返回的是"object"。这是因为特殊值 null 被认为是一个对空对象的引用

严格来讲,函数在 ECMAScript 中被认为是对象。
可是, 函数也有自己特殊的属性。为此,就有必要通过 typeof 操作符来区分函数和其他对象

2.3.2undefined类型

当使用 var 或 let 声明了变量但没有初始化时,就相当于给变量赋予了 undefined 值
目的:明确空对象指针(null)和未初始化变量的区别

但是未声明的变量使用typeof也是undefined,因为他们都属于无法执行实际操作

2.3.3null类型

注意:undefined 值是由 null 值派生而来的,因此 ECMA-262 将它们定义为表面上相等

 null 是一个假值,但也有其他可能是假值的情况

let message = null; 
let age; 
if (message) { 
 // 这个块不会执行
} 
if (!message) { 
 // 这个块会执行
} 

if (age) { 
 // 这个块不会执行
} 
if (!age) { 
 // 这个块会执行
}

 2.3.4boolean类型

注意:布尔值字面量 true 和 false 是区分大小写的,因此True和False并不为布尔值

Booleantruefalse
Number非零值(包括无穷)0,NaN
Object        任意对象null
UndefinedN/A(不存在)undefined

  2.3.5Number类型

八进制:第一个数字必须是0,然后是相应的八进制数字(数值 0~7)。如果字面量中包含的数字超出了应有的范围,就会忽略前缀的零,后面的数字序列会被当成十进制数

(严格模式下八进制无效)

十六进制:前缀 0x(区分大小写),然后是十六进制数字(0~9 以及 A~F,字母大小写均可)

使用八进制和十六进制格式创建的数值在所有数学操作中都被视为十进制数值

注意:+0和-0在所有情况下都被认为是相等的

  1. 浮点值
        因为存储浮点值使用的内存空间是存储整数值的两倍,所以 ECMAScript 总是想方设法把值转换为 整数。例如1.0就会变成1。
        对于较大或非常小的数字,采用科学计数法(对于非常小的数字,e后跟负数)。
let floatNum = 3.125e7; // 等于 31250000,乘10的7次幂

注意:因为浮点数精度不高,所以0.1+0.2!==0.3

      2. 值的范围

        如果某个计算得到的数值结果超出了 JavaScript 可以表示的范围,那么这个数值会被自动转换为一个特殊的 Infinity(无穷)值。任何无法表示的负数以-Infinity(负无穷大)表示,任何无法表示的正数以 Infinity(正无穷大)表示
        如果要确定是否为有限大,可以采用isFinite()
 
      3.NaN
 
        NaN,意思是“不是数值”(Not a Number),用于表示本来要返回数值的操作失败了(而不是抛出错误),例如,0、+0 或-0 相除会返回 NaN
console.log(0/0); // NaN 
console.log(-0/+0); // NaN
        如果分子是非 0 值,分母是有符号 0 或无符号 0,则会返回 Infinity 或-Infinity。
        任何涉及 NaN 的操作始终返回 NaN(如 NaN/10),并且NaN 不等于包括 NaN 在内的任何值
        isNaN()函数可以接受任何类型的参数,然后判断这个参数是否“不是数值”。把一个值传给 isNaN()后,该函数会尝试把它转换为数值。某些非数值的值可以直接转换成数值,如字符串"10"或布尔值。任何不能转换为数值的值都会导致这个函数返回true
console.log(isNaN(NaN)); // true
console.log(isNaN("10")); // false,可以转换为数值 10
console.log(isNaN("blue")); // true,不可以转换为数值
console.log(isNaN(true)); // false,可以转换为数值 1

         4.数值转换

        Number()函数

  • null,返回0
  • undefined,返回NaN
  • 字符串
    • 字符串数值直接转换为数值(包括浮点数字符串)
    • 字符串包含有效十六进制,则将其转换为十进制
    • 空字符串为0
    • 其余返回NaN
  • 对象,调用 valueOf()方法,并按照上述规则转换返回的值

        parseInt()函数

        通常在需要得到整数时可以优先使用 parseInt()函数
  • 从第一个非空格字符开始转换。如果第一个字符不是数值字符、加号或减号,parseInt()立即
    返回 NaN。这意味着空字符串也会返回 Na
  • 如果第一个字符是数值字符、加号或减号,则继续依次检测每个字符,直到字符串末尾,或碰到非数值字符。比如"1234blue"会被转换为 1234,因为"blue"会被完全忽略
  • parseInt()函数也能识别不同的整数格式(十进制、八进制、十六进制),parseInt()也接收第二个参数,用于指定底数(进制数),如parseInt("0xAF", 16)
        parseFloat()函数
 
  • 从位置 0 开始检测每个字符。同样,它也是解析到字符串末尾或者解析到一个无效的浮点数值字符为止。这意味着第一次出现的小数点是有效的,但第二次出现的小数点就无效
  • parseFloat()只解析十进制值
  • 如果字符串表示整数(没有小数点或者小数点后面只有一个零),则 parseFloat()返回整数

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值