JavaScript高级程序设计(第四版)学习笔记(第三章:语言基础)

第三章:语言基础

目录

  1. 语法
  2. 变量
    1. var
    2. let
    3. const
  3. 数据类型
    1. typeof操作符
    2. Undefined类型
    3. Null类型
    4. Boolean类型
    5. Number类型
    6. String类型
    7. Symbol类型
    8. Object类型

1.语法

  • 区分大小写
  • 标识符
  • 所谓标识符,就是变量,函数,属性或者函数参数的名称。可以由一个或者多个字母,下划线,美元符号或数字组成(首个字符必须是字母)ECMAScript标识符使用驼峰大小写形式,也就是第一个字母小写,后面每个单词的首字母大写(非强制)
  • 注释同C语言,单行注释 两个正斜杠,多行注释 一个正斜杠和一个星号开头,以它们的反向组合结尾
  • 语句的分号可加可不加,if之类的控制语句最好在控制语句中使用代码块

  • 现代浏览器都支持严格模式,对脚本启用严格模式,在脚本开头加上一行
"use strict"

也可以单独一个函数在严格模式下执行,只要把预处理命令放在函数体开头就好了

function hi(){
"use strict";
//函数体
}

2.变量

ECMAScript变量是松散类型的,意思是变量可以用于保存任何类型的数据,每个变量不过是一个用于保存任意值的命名占位符。有三个关键字可以声明变量:var const 和let,其中const和let只能在ES6及之后的版本中使用。

2.1var 

使用var 操作符定义的变量会成为包含它的函数的局部变量

比如:

function test(){
var num = 1;    //局部变量
}
console.log(num);  //出错

在函数内定义变量时省略var操作符则可以创建一个全局变量

比如:

function test(){
num =1
}
console.log(num) //输出 1

注意:虽然可以通过省略var 操作符定义全局变量,但是不推荐这么做,在局部作用域中定义的全局变量很难维护,也会造成困扰,在严格模式下,如果给未申明的变量赋值,则会抛出ReferenceError

使用var声明的变量会自动提升到函数作用域顶部,所谓的提升就是将所有变量的声明拉到函数作用域的顶部。此外,反复多次使用var声明同一个变量也没有问题。

2.2let 

let 跟var 的作用差不多,最明显的区别是,let声明的范围是块作用域,var声明的范围是函数作用域

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

let name= "Matt"
console.log(name) //Matt
}
console.log(name) //ReferenceError

暂时性死区

let与var 的另外一个区别是:let声明的变量不会在作用域中被提升。

console.log(name)
var name = "Matt"   // undefined,变量声明了没有定义(赋值)
console.log(name)   //ReferenceError,变量没有声明,找不到
let name = "Matt" 

在let声明变量之前的执行瞬间被称为暂时性死区,在暂时性死区引用后面才声明的变量都会抛出ReferenceError

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

var name = "Matt"
console.log(window.name)  //Matt
let age = 18
console.log(window.age)// undefined

for循环中的let声明

在let出现之前,for循环定义的迭代变量会渗透到循环体外部

for(var i = 5;i<10;i++)
{}

console.log(i)//10

改用let后,这个问题就消失了,因为迭代变量的作用域仅限于for循环内部

常见的题目

for(var i=0;i<5;i++){

setTimeout(()=>console.log(i),0)    // 55555

}

将var 改用为let 后输出 12345

2.3const

const的行为与let基本一致,唯一一个重要的区别:const声明变量的同时必须初始化变量,且无法修改该变量。

最后,在实际使用中应该不使用 var ,优先使用const,其次是let

3.数据类型

JavaScript 有六种简单数据类型 Undefined,Boolean,Null,Number,String,Symbol(ES6新增的),一种复杂数据类型 Object。

3.1.typeof 操作符

对一个值使用typeof操作符会返回下列字符串之一

  • "undefined"表示未定义    
  • "boolean"表示值为布尔值  
  • "string"表示值为字符串  
  • "number"表示值为数值  
  • "symbol"表示值为符号
  • "object"表示值为对象(不是函数)或null
  • "function"表示值为函数

图解:

小结一下:比较特殊的,typeof( null )== object ,typeof ( Function)  == function,严格来说,函数在ECMAScript中被认为是对象,不是一种数据类型。

问题:为什么typeof(null)== object ?

答:null值表示一个空对象的引用。

3.2Undefined类型

声明但是未初始化的变量输出为undefined

let name 
console.log(name) //undefined

未声明的变量输出会报错,输出其类型为undefined

console.log(name) //报错
console.log(typeof name) //undefined

undefined为假值,Number(undefined) == 0

3.3Null类型

逻辑上讲,null表示一个空对象指针,这也是typeof传一个null会返回object的原因。

在定义将来要保存为对象值的变量时,建议使用null来初始化。后面只要检查其值是否为null就可以知道它是否被重新赋值了。

undefined值是由null值派生过来,因此,ECMA-262将它们定义为表面上相等,console.log(undefined==null)//输出 true,类型发生了转换

null是一个假值 Number(null)==0

3.4Boolean类型

不同类型与布尔值的转换规则
数据类型转换为true转换为false
Booleantrue

false

Undefined不存在undefined
Null不存在null
Number非零数值(包括无穷)0,NAN
String非空字符串“” (空字符串)
Object任意对象null

 

3.5Number类型

Number类型使用IEEE754格式表示整数和浮点数(在某些语言中也叫双精度值)

最小值:Number.MIN_VALUE,最大值:Number.MAX_VALUE

正无穷值:Infinity,负无穷值:-Infinity

NAN (Not a Number),用来表示本来要返回数值的操作失败了,比如除数为零的情况:console.log(0/0)

任何涉及NAN的操作始终返回NAN。

NAN不等于包括NAN的任何值,console.log(NAN == NAN)  //false

isNAN()函数,用于判断参数是否“不是数值”,也就是说,看这个值能否转换为数值

  • isNAN(NAN)//true
  • isNAN("78")//false
  • isNAN("red")//true

数值转换

有三个函数可以将非数值转化为数值:Number(),parseInt(),parseFloat()

Number()是转型函数,可用于任何数据类型

parseInt()和parseFloat()主要用于将字符串转换为数值。

Number()函数转换规则:

  • 布尔值,true转换为1,false转换为0
  • 数值,直接返回
  • null,返回0
  • undefined,返回NAN
  • 字符串,含有数值字符的包括其加减号转换为一个十进制的值
  • 其它进制的数统一转换为十进制
  • 空字符串返回0
  • 其他情况返回NAN

3.6String类型

String(字符串)数据类型表示零或多个16位Unicode字符序列,字符串可以使用双引号,单引号,或反引号标识,注意前后标识的一致性

3.6.1字符字面量

字符串数据类型包含一些字符字面量,用于表示非打印字符或有其他用途的字符,记几个常用的: \n 换行,\t 制表,\\ 反斜杠,\'单引号,\''双引号,\`反引号

3.6.2字符串的特点

ECMAScript的字符串是不可变的,要修改其值,必须先销毁原值

3.6.3转换为字符串

  • toString()方法,null和undefined值都没有toString()方法,多数情况下,tostring()不接受参数,不过,在数值调用方法时,tostring()方法可以接收一个底数参数,比如
let num = 10
console.log(num.tostring(16)) // a
  • String()方法,规则:
    • 如果值有toString()方法,则调用该方法(不传参数)
    • 如果值为null,返回"null",值为undefined,返回"undefined"
  • 用加号操作符给一个值加上空字符串""也可以将其转换为字符串

3.6.4模板字面量

模板字面量在定义模板时特别有用,比如下面这个HTML模板:

let pageHTML = `
<div>
    <a href='#'>
        <span>Jake</span>
    </a>
</div>
`

模板字面量会保持反引号内部的空格。

3.6.5字符串插值

字符串插值通过${}中使用一个JavaScript表达式来实现

3.7Symbol类型

Symbol(符号)是ECMAScript6新增加的数据类型。

符号是原始值,且符号实例是唯一,不可变的。符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。

符号的基本用法

let sym = Symbol()
console.log(typeof sym)  //symbol

3.8Object类型

ECMAScript中的对象是一组数据和功能的集合。

ECMAScript中的Object是派生其它对象的基类。Object类型的所有属性和方法在派生的对象上同样存在。

每个object实例都有如下属性和方法。

  • constructor:用于创建当前对象的函数。
  • hasOwnProperty(propertyName):用于判断当前对象实例(不是原型)上是否存在给定的属性。
  • isPrototypeOf(Object):用于判断当前对象是否为另外一个对象的原型
  • propertyIsenumerable(propertyName):用于判断给定的属性是否可以使用
  • toLocalString():返回对象的字符串表示,该字符串反映对象所在的本地化执行环境
  • toString():返回对象的字符串表示
  • valueOf():返回对象对应的字符串,数值或布尔值表示。通常与toString()返回值相同。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值