前端学习笔记(五)-JavaScript语法基本概念

184 阅读8分钟

基本概念

语法

  • 对大小写敏感
  • 采用驼峰命名风格
  • 使用C风格的注释
//单行注释
/*
 * 多行注释
 *
 */
  • 严格模式,一种不同的解析与执行模型
    • 启动方式:在顶部添加代码"use strict"
    • 什么是解析
    • 什么是执行
    • 严格模式究竟会怎么样
  • 语句
    • 单句结尾建议使用分号
    • 使用花括号代码块
    • 始终在控制语句中使用代码块

关键字和保留字

具体略去不表,查文档即可

不要使用关键字和保留字作为标识符和属性名

变量

JS中变量仅仅是一个用于保存值的占位符,没有变量类型所带来的限制

  • 变量的声明方式(未初始化):var message
  • 变量的声明方式(直接初始化):var message="hi"

未经过初始化的变量,会保存一个特殊的值:undefined

与变量有关的另一个需要注意的地方就是变量的作用域

通过var操作符定义的变量都将成为定义该变量的作用域中的 “局部变量”

  • 若var操作符在function函数中,那么这个变量就是局部变量,在函数退出后就会被销毁。
  • 若var操作符在函数外,<script>内,那么这个变量就是全局变量,在网页关闭后被销毁。

略去var操作符创建全局变量 赋值给尚未进行声明的变量

    carname="Volvo";

数据类型

JS的数据类型由5种基本数据类型:UndefinedNullBooleanNumberString和1种复杂数据类型:Object组成。

检测给定变量的数据类型:typeof操作符

  • null:已声明的变量,变量保存一个空对象指针
  • undefined:表明未声明的变量
  • 已声明的变量,强制进行初始化

Undefined类型 该类型只有一个值:undefined。用于表示使用var声明的但未进行初始化的变量。

由于typeof操作符对尚未声明的变量已声明未初始化的变量的返回结果一致,都是undefined。所以强制显式地初始化变量是必须的,因为当通过typeof操作符进行检测时就能够知道被检测的变量还没有进行声明。

Null类型 该类型只有一个值:null,表示一个空对象指针。通过typeof操作符返回object

undefined值派生自null值,它们的相等性测试要返回true

null值的用途:只要,当变量的使用目的是用于保存对象,在这个对象还没有真正保存对象时,就应该明确地让该变量保存null值。

Boolean类型 该类型只有两个字面值:truefalse

JS中所有类型的值都有与这两个Boolean值等价的值。转换规则如下:

数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 空字符串 ""
Number 任何非零数字值 0和NaN
Object 任何对象 null
Undefined 不适用 undefined

Number类型

字面量格式支持十进制var intNum=55,八进制var octalNum=070和十六进制var hexNum=0xA

其中八进制字面量的第一位必须是0(严格模式下不支持),十六进制的前两位必须是0x。在进行算术计算时,上述数值最终都将被转换成十进制的数值。

浮点数:

  1. 浮点数的表示方法var floatNum=1.1
  2. JS会智能地将浮点数值转换为整数值。
  3. 用科学计数法表示浮点数var floatNum=3.125e7
  4. JS中的浮点数采用IEEE754规格,因此会存在计算精度问题。所以,永远不要测试某个特定的浮点数值。

Number类型的数值范围:Number.MIN_VALUE(通常是5e-324)~Number.MAX_VALUE(通常是1.7976931348623157e+308 )

超出数值范围的表示:Number.NEGATIVE_INFINITY(-Infinity)Number.POSITIVE_INFINITY(Infinity)

NaN:表示一个本来要返回数值的操作数,没有返回数值的情况。

  • 任何涉及NaN的操作都会返回NaN。
  • NaN与任何值都不相等。
  • 通过isNaN()函数进行判断

数值转换: 有3个函数可以把非数值转换为数值:Number()parseInt()parseFloat()

Number(),用于任意数据类型,转换规则如下

  1. Boolean:true->1,false->
  2. 数字值,简单的转入和返回
  3. null->0;
  4. undefined->NaN
  5. 字符串遵循以下规则:
    • 只包含数字,则将其转换为十进制数值
    • 如果包含有效的浮点格式,则将其转换为对应的浮点数值
    • 如果包含有效的十六进制格式,则将其转换为相同大小的十进制整数值
    • 如果字符串是空的,则转换为0
    • 其他情况,则转换为NaN
  6. 如果是对象,则先调用对象的valueOf()方法,依照前面的规则进行转换。若转换结果是NaN,则调用对象的toString,依照前面的规则进行转换。

String类型 字符串可以由双引号或单引号表示。

JS中的字符串是不可变的。

转换字符串的方式:toString()和转型函数String()

toString()在默认情况下以十进制格式返回数值的字符串表示。通过传递参数可以输出任意有效禁止格式表示的字符串值。toString()不支持null和undefined值。

String()的转换规则:

  • 如果值有toString()方法,则调用该方法。
  • null->"null"
  • undefined->"undefined"

Object类型 定义方式:var o =new Object()

Object类型是JS中所有实例的基础,Object的每个实例都具有下列属性和方法:

  • constructor:构造函数,保存着用于创建当前对象的函数。
  • hasOwnProperty(propertyName):检查给定的属性是否在当前对象实例中。
  • isPrototypeOf(object):检查该实例是否是传入参数object的原型
  • propertyIsEnumerable(propertyName):检查给定的属性是否能够使用for-in来枚举
  • toLocaleString():返回对象的字符串表示,与执行环境的地区对应
  • toString():返回对象的字符串表示
  • valueOf():返回对象的字符串、数值或布尔值表示。

操作符

一元操作符

递增和递减操作符:直接借鉴C

一元加减操作符:非数值会按照Number()函数的规则进行转换。

位操作符

JS中所有数值都以IEEE754 64位格式进行存储。但位操作符的执行方式是先将64位转换成32位,然后执行操作,最后再将结果转换为64位。

布尔操作符

操作符首先会把它的操作数转换为一个布尔值,然后再进行布尔操作。

乘性操作符

非数值情况下,先使用Number()转型函数将其转换为数值。

加性操作符

如果两个操作数都是字符串,则进行字符串的拼接。如果其中一个操作数是字符串,则将另外一个操作数转换为字符串,然后再将两个字符串拼接起来。

如果想先对数值计算进行解析,应使用圆括号。

var num1=5;
var num2=10;
var message= "The result is" + (num1+num2);
关系操作符

关系操作符比较两个字符串时,比较的是两个字符串对应的字符编码值。

任何操作数与NaN进行关系比较,结果都是false

相等操作符

相等和不相等:先转换再比较。操作数都转换成数值类型进行比较。

全等和不全等(推荐使用):仅比较而不转换

条件操作符

variable=boolean_expr ? true : false

赋值操作符
逗号操作符

在一条语句中执行多个操作:var num1=1,num2=2,num3=3;

语句

if语句

类C,始终使用代码块。

    if(condition)
        {statement1}
    else{statement2}
do-while语句

后测试循环语句。类C

    do{
        statement;
    }while(expr);
while语句
    while(expr){
        statement;
    }
for语句

类C

var count=10;
for(var i=0;i<count;i++){
    alert(i);
}
for-in语句

迭代语句,用于枚举属性

    for(property in expression){
        statement;    
    } 

为了保证最大限度的兼容性,在使用for-in语句前,先检测确认该对象的值是否是null或undefined。

break和continue
with语句

将代码的作用域设置到一个特定的对象中。不建议使用。

switch语句

类C。

特色之处在于:

  • 可以在switch语句中使用任何数据类型
  • 每个case的值不一定是常量,可以是变量,甚至是表达式。
  • switch语句在比较值时使用的是全等操作符,因此不会发生类型转换。

函数

函数的基本语法

function functionName(arg0,arg1,...,argN){
    statements;
}

参数的理解

  • JS中函数的参数在内部是用一个对象arguments来表示的。arguments对象拥有数组的行为。函数接收到的始终都是这个数组。

  • arguments对象只是拥有数组的行为,并不是数组的实例。

  • JS函数中命名的参数只是提供便利,但不是必须的。因为JS中没有函数签名的概念。因此JS中也没有函数重载功能。

    • 可以利用arguments对象实现重载
  • arguments对象可以与命名参数一起使用。它的值永远与对应命名参数的值保持同步。但是arguments对象与命名参数的内存空间是相互独立的。arguments对象的长度是由传入的参数个数决定的。

  • 没有传递值的命名参数将自动被赋予undefined值