JavaScript基础

73 阅读5分钟

1.1、语法

JavaScript很大程度上借鉴了C语言和其他类C语言。

  • 区分大小写
  • 标识符:字母、数字、下划线、美元符号组成,不能以数字开头,不能将关键字、保留字false、true、null作为标识符
  • 注释:单行注释和多行注释
  • 严格模式:整个脚本启用:在文件的开头写上:"use script";,单独指定某个函数:只需将这个预处理器指令加到函数体的开头即可
  • 语句以分号结尾(推荐),有助于在某些情况下提升性能
  • 代码块{},多条语句合并在一个代码块里

1.2 关键字和保留字

1.2.1 关键字:

break do in typeof
case  else  instanceof var
catch export new void
class extends return while
const finally super with
continue for switch yield
debugger function this
default if throw
delete import try

1.2.2 保留字:

  • 始终保留:enum
  • 严格模式下保留:implements package public interface protected static let private
  • 模块代码中保留:await

1.3 变量

JavaScript使用3个关键字定义变量var\let\const

1.3.1 var关键字

  • 格式:var 变量名

  • 未初始化时,变量会保存一个特殊值:undefined

  • 函数作用域:使用var声明的范围是函数作用域

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

  • 一条语句定义多个变量,用逗号隔开

  • var在全局作用域中声明的变量会成为window对象的属性

  • var声明提升:使用var声明的变量会自动提升到函数作用域顶部(将所有变量声明拉到函数作用域的顶部)

    function foo(){
        console.log(age);
        var age = 18;
    }
    foo(); // undefined
    
    等价于:
    function foo(){
        var age;
        console.log(age);
        age = 18;
    }
    foo(); // undefined
    
  • 反复多次使用var声明同一个变量也没有问题

    function foo(){
        var age = 12;
        var age = 13;
        var age = 14;
        console.log(age);
    }
    foo(); // 14
    

1.3.2 let声明

letvar的作用差不多,最明显的区别时:let声明的是块作用域。块作用域是函数作用域的子集。

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

if (true){
    let name = 'codeyu';
    console.log(name); // codeyu
}
console.log(name); // ReferenceError:age没有定义
  • let不允许在同一个代码块里出现冗余重复的声明

  • 暂时性死区:

    letvar 的另一个重要区别是,let声明的变量不会在作用域中被提升。

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

  • 全局声明:使用let在全局作用域中声明的变量不会成为window对象的属性

  • 不能使用let进行条件式声明

1.3.3 const声明

const的行为和let基本一致,唯一一个重要区别是:const声明的时候必须同时初始化变量,且不能在后续中修改,尝试修改const声明的变量会导致运行时错误。

  • 也不允许重复声明
  • 声明的作用域也是块
  • const变量引用一个对象,那么修改这个对象内部的属性并不违反const的限制

1.3.4 声明风格及最佳实践

  • 不使用var
  • const优先,let次之

1.4 数据类型

ECMAScript 有6中基本简单数据类型(也叫原始类型):Undefined Null Boolean Number String Symbol,以及一种复杂数据类型Object

1.4.1 typeof操作符

用来确定任意变量的数据类型,是一个操作符而不是函数(不需要传参数,但可以使用参数),对于一个变量使用typeof操作符会返回以下字符串之一:

  • undefined:表示值未定义
  • boolean:表示值为布尔值
  • string:表示值为字符串
  • number:表示值为数值
  • object:表示值为对象(而不是函数)或者null
  • function:表示值为函数
  • symbol:表示值为符号
let message = 'zzzzz';
console.log(typeof message); // string
console.log(typeof(message)); // string
console.log(typeof 99); // number
console.log(typeof null); // object,null被认为是一个空对象的引用

1.4.2 Undefined类型

Undefined 类型只有一个值:undefined,当使用var或者let声明变量但未初始化的时候,这个变量的值就是undefined

let message;
console.log(message == undefined); // true

对未初始化的变量调用typeof时,结果是 undefined

对未声明的变量调用typeof时,结果也是undefined

undefined是一个假值。

1.4.3 Null类型

Null类型同样也只有一个值null

逻辑上来说,null值表示一个空对象指针,这也是对null使用typeof返回object的原因;

let cat = null;
console.log(typeof car); // object

用途:用来初始化将来用到的变量;另外undefined值是有null派生而来的,所以console.log(undefined == null) // true

null也是一个假值。

1.4.4 Boolean类型

Boolean类型有两个字面值:true false,是使用最频繁的类型之一;

要将一个其他类型的值转换为布尔值,可以调用Boolean()函数;

不同类型域布尔值之间的转换关系:

数据类型转换未true的值转换为false的值
Booleantruefalse
String非空字符串""(空字符串)
Number非零数值(包括无穷值)0,NaN
Object任意对象null
UndefinedN/A(无)undefined

1.4.5 Number类型

  1. 浮点数:0.1 + 0.3 != 0.3

  2. 值的范围:Number.MIN_VALUE(保存最小值) Number.MAX_VALUE(保存最大值) 无穷值:Infinity (可加正负号表示正负无穷大)

  3. NaN:意思是不是数值(Not a Number),用来表示本来要返回数值的操作失败了(而不是抛出错误)。

    eg:0 +0 -0相除返回NaN

    任何设计NaN的操作始终返回NaN

    NaN不等于包含它自己在内的任何值:console.log(NaN == NaN) // false

    ECMAScript提供了isNaN()函数来判断一个值是否是:“不是数值”;console.log(isNaN(NaN)) // true任何不能转换为数值的值调用这个函数返回值都是true

  4. 数值转换:有3个方法:Number() parseInt() parseFloat()

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

      Number(true) // 1
      Number(false) // 0Number(数值) // 直接返回
      Number(null) // 0
      Number(undefined) // NaN
      字符串:
      Number(空字符串)//返回0
      
    • parseInt() parseFloat()用于将字符串转换为数值;