JavaScript基本语法

JavaScirpt变量提升

两个例子:

console.log(a);
var a = 1;

控制台显示:undefined

console.log(b);
b = 1;

控制台显示:ReferenceError: b is not defined

分析:

  1. JS里存在变量提升机制:即在JS代码运行之前会事前解析JS里的所有代码,然后将声明变量的语句放到最前面,所以第一个例子中的var a =1;(效果等于var a ; a = 1;)[var a;]被提前解析到了前面,所以console.log(a);语句执行的时候,a=1;这条语句由于不是变量的声明(没有var)所以没有被执行,所以此时变量a没有被赋值,所以console.log(a);的结果为undefined.
  1. 在第二个例子中没有var即没有变量声明的语句,所以没有代码被提前,这里的b不是一个变量,而是windows顶层对象的一个属性,所以这个时候把b打印出来会报错(即b没有被定义)

JavaScript标识符

第一个字母只能是Unicode字母(包括英文字母和其他语言的字母)或美元符号或者下划线,除此以外的字母可以是Unicode字母或美元符号或者下划线和数字1~9.但是不能是关键字或者保留字。也不建议使用带有特殊意义的单词(NaN undefinded Infinity)

JavaScript注释

要注意的是也会被视为单行注释(因为JS历史上兼容HTML的注释)都是注释其之后的代码块 并且-->只有放在行首才会被解析成注释。放在其他位置的作用等于一元操作符++和大于符号>的组合。

JavaScript区块

JavaScript使用大括号,将多个相关的语句组合在一起,称为“区块”(block)。
与大多数编程语言不一样,JavaScript的区块不构成单独的作用域(scope)。也就是说,区块中的变量与区块外的变量,属于同一个作用域。

{
  var a = 1;
}

a // 1

上面代码在区块内部,声明并赋值了变量a,然后在区块外部,变量a依然有效,这说明区块不构成单独的作用域,与不使用区块的情况没有任何区别。所以,单独使用的区块在JavaScript中意义不大,很少出现。区块往往用来构成其他更复杂的语法结构,比如for、if、while、function等。

JavaScript switch

需要注意的是,switch语句后面的表达式与case语句后面的表示式,在比较运行结果时,采用的是严格相等运算符(===),而不是相等运算符(==),这意味着比较时不会发生类型转换。代码如下

var x = 1;

switch (x) {
  case true:
    console.log('x发生类型转换');
  default:
    console.log('x没有发生类型转换');
}
// x没有发生类型转换

JavaScript数值

表示方法:科学计数法 例:16e2(16*10^2) 16e-2(16*10^-2)
存在两种情况,JS会自动将数值转换成科学计数法

  1. 小数点前的数字多于21位。
  1. 小数点后的零多于5个。

数值的进制
默认情况下,JavaScript内部会自动将八进制、十六进制、二进制转为十进制。下面是一些例子。

0xff // 255
0o377 // 255
0b11 // 3

特殊数值

1. 0和-0

几乎所有场合0和-0都是等价的,唯一有区别的场合是,+0或-0当作分母,返回的值是不相等的。

(1 / +0) === (1 / -0) // false

2. NaN

1.NaN表示''非数字''(Not a Number)主要出现在将字符串解析成数字出错的场合。当0除以0时,也会出现NaN,0乘以Infinity,也会返回NaN;Infinity减去或除以Infinity,得到NaN。

3.运算规则
NaN与任何数(包括它自己)的运算,得到的都是NaN。(NaN === NaN)返回的结果是false

4.判断NaN的方法
isNaN方法可以用来判断一个值是否为NaN.
但是,isNaN只对数值有效,如果传入其他值,会被先转成数值。比如,传入字符串的时候,字符串会被先转成NaN,所以最后返回true,这一点要特别引起注意。也就是说,isNaN为true的值,有可能不是NaN,而是一个字符串。
判断NaN更可靠的方法是,利用NaN是JavaScript之中唯一不等于自身的值这个特点,进行判断。

function myIsNaN(value) {
  return value !== value;
}

与数值相关的全局方法

parseInt()

parseInt方法用于将字符串转为整数。如果字符串头部有空格,空格会被自动去除。

如果parseInt的参数不是字符串(必须是合法的表达式),则会先转为字符串再转换。

parseInt(123aaa);
//Uncaught SyntaxError: Invalid or unexpected token

注意:这里传入的参数会先进行运算,但是123aaa是一个无效的表达式,所以程序不知道怎么转化。程序并不会聪明的以为你输入是parseInt('123aaa');

字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。
如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN。

字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。

如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN。

parseInt('abc') // NaN
parseInt('.3') // NaN
parseInt('') // NaN
parseInt('+') // NaN
parseInt('+1') // 1
  1. 上述第二行代码由于无法解析小数点'.'所以返回NaN(反直觉 - -)

  2. 上述第三行代码中传入的参数为空字符串。效果等同于parseInt(); 需要注意的是在JS中parseInt方法和Number方法虽然都可以把传入的参数转化为数字,但是Number会把空字符串转化成0,而parseInt方法会把空字符串转化成NaN

  3. 上述第四行代码中的'+'并不能转化为数字所以是NaN但是第五行代码中的+号属于数字的正负号,这种情况除外。

  4. 对于那些会自动转为科学计数法的数字,parseInt会将科学计数法的表示方法视为字符串,因此导致一些奇怪的结果。

parseInt(1000000000000000000000.5) // 1
// 等同于
parseInt('1e+21') // 1
parseInt(0.0000008) // 8
// 等同于
parseInt('8e-7') // 8

5.进制转换parseInt方法还可以接受第二个参数(2到36之间),表示被解析的值的进制,返回该值对应的十进制数。默认情况下,parseInt的第二个参数为10,即默认是十进制转十进制。

parseFloat()方法

  • .parseFloat方法用于将一个字符串转为浮点数。
  • 如果字符串符合科学计数法,则会进行相应的转换。
  • 如果参数不是字符串,或者字符串的第一个字符不能转化为浮点数,则返回NaN。
    parseInt和parseFloat方法均在一种程度上不同于Number函数。
parseFloat(true)  // NaN
Number(true) // 1
parseFloat(null) // NaN
Number(null) // 0
parseFloat('') // NaN
Number('') // 0

JavaScript字符串

  • 如果要在单引号字符串的内部,使用单引号(或者在双引号字符串的内部,使用双引号),就必须在内部的单引号(或者双引号)前面加上反斜杠,用来转义。
  • 字符串默认只能写在一行内,分成多行将会报错。如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠。(注意,反斜杠的后面必须是换行符,而不能有其他字符(比如空格),否则会报错。)

long
long
string";
longString
// "Long long long string"


##转义
- 反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。
- 如果字符串的正常内容之中,需要包含反斜杠,则反斜杠前面需要再加一个反斜杠,用来对自身转义。
- 上面代码中,a是一个正常字符,前面加反斜杠没有特殊含义,反斜杠会被自动省略。
- 字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始),使用数组的length方法,用来返回字符串的长度。(但是实际上无法通过调用这两种方法改变字符串的长度或者字符)

##Base64转码

JavaScript原生提供两个Base64相关方法。
- atob():Base64编码转为原来的编码
- btoa():字符串或二进制值转为Base64编码
PS:这两个方法不适合非ASCII码的字符,会报错。

btoa('你好')
// Uncaught DOMException: The string to be encoded contains characters outside of the Latin1 range.

你可能感兴趣的:(JavaScript基本语法)