JavaScript高级程序设计——第三章(JS基本语法)

一.前言

本篇是js基础语法,基本类型和基本操作符的介绍。内容虽然简单,但需要熟练记忆,后面会围绕本章几种类型展开学习。

二.严格模式

1.要在整个脚本种启用严格模式,可以在顶部添加代码:

'use strict'

2.当然也可以在特地的函数中使用严格模式:

function useStrict(){
  ‘use strict’
  //函数体
  ......
}

三.数据类型

①数据类型的分类

1.简单数据类型

undefined,null,boolean,number,string

2.复杂数据类型

object

②type of操作符的特殊情况

Safari5和chrome7之前——type of null 返回’function’
其他浏览器返回——‘object’,因为特殊值null会被认为是一个空的对象引用。

③当声明了一个变量但是没有初始化,这个变量的值为undefined。

④对没有声明的变量,只能进行一个操作,那就是type of,其他的操作均会报错。不管是声明了没有初始化还是没有声明的变量,type of进行操作后,都会返回undefined。

⑤Boolean类型

1.Boolean的值是区分大小写的,也就是说True和false只是标识符而不是Boolean类型。

2.通过Boolean()转型函数可以对其他类型变量转换成boolean类型,需要注意以下几点。

  1. 非空字符串为true,空字符串为false
  2. 非零数字值为true,0和NaN为false
  3. 任何非null的object对象都为true,null则转型为false
  4. undefined转型为false

⑥Number类型

  1. 任何涉及NaN的操作,都会返回NaN。NaN与任何数值都不相等,包括NaN。针对NaN的这两个特点,有一个函数是isNaN(),这个函数在接受一个值之后,会尝试将这个值转换为数值,如果可以转换则为true,不能转换则为false,比如isNaN(“blue”)则返回false,isNaN(true)则返回true。

  2. 数值转换函数
    ①Number():可以用于任意数据类型,符合以下规则:
    1.boolean类型:false和true分别为0和1。
    2.number类型:简单的返回。
    3.null类型:返回0。
    4.undefined:返回NaN。
    5.string类型:如果只包含数字,则转换成十进制数字,‘011’会变成11,前面的0会被忽略。包含有效的浮点格式,‘1.1’会转换为对应的浮点数值。包含有效的十六进制格式,转换为对应的十六进制格式数值。空字符串转换为0。包含除以上数据以外的数据,则会转换为NaN。
    6.object类型:先调用valueof()方法,并返回值,如果返回的是NaN,则调用toString()方法,并返回值

②parseInt():处理字符串时专用,它会忽略字符串前面的空格,直到找到第一个非空格字符,如果第一个字符不是数字字符或者负号,会返回NaN,所以转换空字符串会转换成NaN。如果第一个字符是数字字符,会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符,比如‘1234blue’会转换为1234。parseInt()也可以识别八进制和十六进制,比如parseInt(‘070’)会得到56,在ECMAScript3 JavaScript引擎中,可以识别八进制的数,但是在ECMAScript5 JavaScript引擎中,parseInt()不能识别八进制,即‘070’会被识别为70,**为了消除上述困惑,可以提供第二个参数——var num = parseInt(‘0xAF’,16),就表示转换的是十六进制格式的字符串。**也可以不带上0x,表示一样的意思。

③parseFloat():处理字符串时专用
1.字符串中第一个小数点是有效的,第二个以后都是无效的,parseFloat(‘22.34.5’)会返回22.34。
2.会忽略前导的0,同时如果为十六进制格式,则返回0。parseFloat()只解析十进制值,因此没有用第二个参数指定基数的用法。
3.虽说是用来转换成浮点数,但是如果字符串包含的是一个可以解析为整数的数,则会返回整数。

⑦string类型

1.转换成字符串类型:toString()。数值,布尔值,对象和字符串都有toString()方法,null和undefined没有toString()方法。多数情况下,使用toString()方法不需要传递参数,但是在调用数值的toString()方法时,可以传递一个参数:输出数值的基数。

var num = 10
alert(num.toString(2)) //“1010”
alert(num.toString(8)) //“12”

2.在不知道转换值是否是null或者undefined的情况下,还可以使用转型函数String(),遵循以下规则:
①如果值有toString()方法,则调用方法并返回相应的结果。
②如果值是null,则返回null。
③如果值是undefined,则返回undefined。

⑧object类型

object类型每个实例都具有下列属性和方法:
1.constructor:保存用于创建当前对象的函数。
2.hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中是否存在。
3.isPrototypeOf(object):用于检查传入的对象是否是当前对象的原型。
4.propertyIsEnumerable(propertyName):用于检查给定的属性能否使用for-in语句来枚举。与hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。
5.toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
6.toString():返回对象的字符串表示。
7.valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法返回的值相同。

四.操作符

①一元操作符
1.递增和递减操作符:分为前置递增递减和后置递增递减。执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。 后置递增和递减操作是在包含它们的语句被求值之后才执行的。
–num和++num,num++和num–
这四个操作符对任何值都适用,它们不止适用于整数,还适用于字符串,布尔值,浮点数值和对象。适用规则如下:

  1. 应用于包含有效数字字符的字符串时,先转换为数字值,再执行加减1的操作,最后变成数值变量。
  2. 应用于一个不含有有效数字字符的字符串时,设置为NaN。
  3. 应用于false,先置为0再加减1。应用于true,先置为1再加减1。
  4. 应用于浮点数值时,执行加减1的操作。
  5. 应用于对象跟Number()类似,valueOf() -> toString()。

2.一元加和减操作符

var num = 25
num = +num

在对非数值应用一元加操作符时,会像Number()转型函数一样对这个值进行转换。
一元减操作符主要用于表示负数,使用一元减操作符时,如果作用于非数值,也同样会使用与一元加操作符一样的规则转换为数值,再转换为负数。

②位操作符

  1. 按位非
var num1 = 25
var num2 = ~num1
alert(num2) //-26

按位非的实质:操作数的负值-1

  1. 按位与
var result = 25 & 3
alert(result) //1

将25和3转换成二进制,每一位进行与操作。

  1. 按位异或
var result = 25 ^ 3
alert(result) //26

将25和3转换成二进制,每一位进行异或操作。

  1. 左移
var oldValue = 2  //等于二进制的10
var newValue = oldValue << 5  //等于二进制的1000000,十进制的64

如上,转换为二进制进行移动,左移不会影响操作数的符号位,-2向左移动5位,结果将是-64。

  1. 有符号的右移
var oldValue = 64  //等于二进制的1000000
var newValue = oldValue >> 5  //等于二进制的10,即十进制的2
  1. 无符号的右移
var oldValue = 64  //等于二进制的1000000
var newValue = oldValue >>> 5  //等于二进制的10,即十进制的2

无符号的右移是三个>,对正数来说,无符号的右移的结果与有符号右移的结果相同。但对于负数来说,无符号右移是以0来填充空位,有符号右移是以符号位的值来填充空位。

③布尔操作符

  1. 逻辑非
alert(!'blue') //false

可以理解为非空的数据结构即转换为true。对象或者非空字符串等等转换为false。无论是什么数据类型,逻辑非都会返回一个布尔类型

  1. 逻辑与
var value = 'blue' && true  //true

逻辑与可以应用于任何类型的操作数,它属于‘短路操作’,即第一个操作数能够决定结果(即是false),那么就不会再对第二个操作数求值。比如

var found = false
var result = (found && abc)
alert(result)   //abc未定义,但是不会发生错误,因为found已经决定了结果

同时,还具备以下规则:
1.如果第一个操作数是对象,则返回第二个操作数。
2.如果第二个操作数是对象,只有在第一个操作数为true的情况下才会返回第二个操作数。
3.第一个操作数为null,undefined,NaN,则返回相应的数据。

  1. 逻辑或

同样,逻辑或也是短路操作,如果第一个操作数可以决定结果(即是true),那么就不会再对第二个操作数求值。

同时,还具备以下规则:
1.如果第一个操作数是对象,则返回第一个操作数。
2.第一个操作数结果为false,则返回第二个操作数。
3.两个操作数都为null,undefined,NaN,则返回相应的数据。

④关系操作符

  1. 包含> < <= >=
  2. 如果一个操作数是数值,则将另一个操作数转换为数值,然后进行比较。
  3. 同Number()一样,先调用valueOf()方法,没有就调用toString()方法。
  4. 比较布尔值也是转换为数值进行比较。
  5. 比较两个字符串时,由于大写字符的字符编码全部小于小写字母的字符编码,所以字符串比较会出现奇怪的情况。

⑤相等操作符

  1. 即 ==
  2. 如果一个操作数是对象,则调用valueOf()方法,得到基本类型再进行比较。
  3. null和undefined是相等的。

⑥条件操作符

var max = (num1 > num2) ? num1 : num2

⑦赋值运算符
没啥好说的,就是 =

⑧逗号运算符

var num1 = 1,num2 = 2,num3 = 3
var num = (5,1,4,8,0)  //num的值为0

五.语句

  1. label语句
start:for(var i=0;i<10;i++){
alert(i)
}

这个例子中的start标签可以在将来由break或continue使用,加标签的语句一般都要与for语句等循环语句配合使用。

  1. break与continue语句
    break在循环中会立即退出循环,强制执行循环后面的语句。
    continue在循环中会立即退出循环,但是会从循环的顶部继续执行。

  2. with语句
    目的是为了简化多次编写同一个对象的操作。严格模式下不允许使用with语句,否则将视为语法错误。

var qs = location.search.a
var hostName = location.search.b
var url = location.href

//可以简写成
with(location){
  var qs = search.a
  var hostName = search.b
  var url = location.href
}
  1. switch
    ECMAScript可以在switch中使用任意数据类型。
switch('i love u'){
......
}

六.函数

  1. 理解参数
    ①ECMAScript不介意传递进来多少个参数,也不介意传递进来什么数据类型。就是说即便你定义的函数只接受两个参数,在调用函数时也不一定要传递两个参数,可以传递一个,三个。
    究其原因,是因为ECMAScript中的参数在内部是用一个数组表示的,函数接受到的始终是这个数组,而不关心里面包含的参数。在函数体中可以通过arguments对象来访问这个参数数组。

  2. 关于arguments有一点很有趣,
    它的值永远与对应命名参数的值保持同步。

function add(num1,num2){
	arguments[0] = 10
	alert(arguments[1] + 10)
}

此时第一个参数的值变为了10,因为arguments对象中的值会自动反映到命名参数。不过这并不说明两个值访问同样的命名空间,他们的空间是独立的,但是他们的值会同步,但是如果只有一个参数,则arguements[1]不会反映到命名参数中。

  1. 没有重载
    ECMAScript不可能真正实现重载。
    ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值