javaScript基础语法(2)

x33g5p2x  于2021-08-23 转载在 JavaScript  
字(8.9k)|赞(0)|评价(0)|浏览(246)

三基本语法

3.1 语法

  • 严格区分大小写

  • 标识符 :

第一个符合必须是字母或者 下划线 _ , 或者 美元符 $;

其它字符可以是美元符号,下划线,数字,字母

  • 每条语句以封号表示结尾;
  • 多条语句合并一条要使用 花括号{ }

3.2 关键字

在 JavaScript 中,一些标识符是保留关键字,不能用作变量名或函数名。

abstractargumentsbooleanbreakbyte
casecatchcharclass*const
continuedebuggerdefaultdeletedo
doubleelseenum*evalexport*
extends*falsefinalfinallyfloat
forfunctiongotoifimplements
import*ininstanceofintinterface
letlongnativenewnull
packageprivateprotectedpublicreturn
shortstaticsuper*switchsynchronized
thisthrowthrowstransienttrue
trytypeofvarvoidvolatile
whilewithyield

3.3 变量

定义变量使用 var, 后接变量名,其可以保存任何值,如果是未初始化的值就会保存特殊值 undefined;

var message ;

定义变量并且赋值

var message = "zszxz";

var 定义的变量是局部变量,如果在函数体中定义,只在此函数体范围内有效;如果去除var关键字则表示全局变量;

定义多个变量使用逗号 , 隔开

var message = 100, fund = 100 ;

3.4 数据类型

有 五种简单数据类型(Undefined, Null, Doolean, Number, String)和一种复杂数据类型(Object)

type of 检验数据类型

var message = 3
// number
alert(typeof(message));

type of null 返回 是一个 Object, null也是对象的一种;

typeof检测函数返回时一个function;

undefined类型

undefined类型 的值也是 undefined 表示 变量未被初始化;

var msg;
// true
alert(msg == undefined)

如果是给定未定义的变量则会出现错误;但是 type of 却属于 undefined ;

Null类型

 var message = null;
 // object
 alert(typeof(message));

undefined 是 null 的派生 故它们相等

// true
alert(null == undefined);

使用null赋值变量可以进行非空判断

if (msg != null){
	// 内容
}

Boolean类型

Boolean类型 只有 true 和 false ;

var message = true;
var msg = false;
// false
alert(msg == message);

转为 Boolean值 可以调用Boolean()

var msg = "zzz";
// true
alert(Boolean(msg));

转换规则:一般遵循非空,数字非0转换未true;否则为false;具体规则需要自行查阅

Number

number 类型表示整数或者浮点数;

整数

十进制

var msg = 100;

八进制以0开头

// 13
var msg = 015

十六进制以 0x 开头

// 10
var msg = 0xA

浮点数

// 浮点数
var msg = 1.1
// 自动转为整数
var msg2 = 1.0

如果是大数值是以e表示10的指数次幂,

var msg = 10e2;
// 1000
alert(msg);

浮点数的精确度远不如整数,有效位17小数位;

超出范围就是Infinity(正无穷大)和 -Infinity(负无穷大);

var message = Number.MAX_VALUE + Number.MAX_VALUE ;
// false
alert(isFinite(message));

NaN

  1. NaN(Not a number) 非数值;
  2. 任何涉及 NaN 的操作(例如 NaN /10)都会返回 NaN;
  3. 任何数值除以 0会返回 NaN;
  4. NaN 与任何值都不相等,包括 NaN 本身;
  5. 可以使用isNaN()(其能将参数试图转为数值,若转换成果返回false,否则true)判定是否是数值;
// false
alert(isNaN("6"));
// true
alert(isNaN("z"))

Number() 函数的转换规则如下。

  • 如果是 Boolean 值, true 和 false 将分别被转换为 1 和 0。
  • 如果是数字值,只是简单的传入和返回。
  • 如果是 null 值,返回 0。
  • 如果是 undefined ,返回 NaN 。
  • 如果是字符串,遵循下列规则。

如果字符串中只包含数字,则将其转换为十进制数值,即 "1"会变成 1

如果字符串中包含有效的浮点格式,如 "1.1" ,则将其转换为对应的浮点数值

如果字符串中包含有效的十六进制格式,则将其转换为相同大小的十进制整数值

如果字符串是空的(不包含任何字符),则将其转换为 0

其它情况转为NaN

  • 如果是对象,则调用对象的 valueOf() 方法,然后依照前面的规则转换返回的值
  • 如果转换的结果是 NaN ,则调用对象的 toString() 方法,然后再次依照前面的规则转换返回的字符
    串值

parseInt() 将字符串转为数值;

  • 会忽略前面的空格;
  • 如果第一个字符不是数字字符或者负号, parseInt()就会返回 NaN ;
  • 遵守8进制,16进制转换规则;
var num1 = parseInt("10", 2); //2 (按二进制解析)
var num2 = parseInt("10", 8); //8 (按八进制解析)
var num3 = parseInt("10", 10); //10 (按十进制解析)
var num4 = parseInt("10", 16); //16 (按十六进制解析)

parseFloat() 将字符串转为浮点数型;

  • 只解析十进制值
  • 如果字符串包含的是一个可解析为整数的数, parseFloat() 会返回整数

String 类型

String 类型用于表示由零或多个 16 位 Unicode 字符组成的字符序列,即字符串;字符串可以由双
引号(")或单引号(')表示;

转义

  • n 换行
  • \t 制表
  • \b 空格
  • \r 回车
  • \f 进纸
  • \ 斜杠
  • \' 单引号( ' )
  • \" 双引号( " )
  • \unnnn 以十六进制代码 nnnn 表示的一个Unicode字符(其中 n 为0~F)
  • \xnn 以十六进制代码 nn 表示的一个字符(其中 n 为0~F)

获取字符串长度可以使用length属性

字符串具有不可变性

将其它类型字符串:

var msg = 10;
alert(msg.toString());
// 转8进制
alert(msg.toString(8));
// 转二进制
alert(msg.toString(2));

String() 函数遵循下列转换规则:

如果值有 toString() 方法,则调用该方法(没有参数)并返回相应的结果;

如果值是 null ,则返回 "null" ;

如果值是 undefined ,则返回 "undefined" 。

Object 类型

对象其实就是一组数据和功能的集合,通过 new 方式创建对象;

Object 类型是所有它的实例的基础

Object 的每个实例都具有下列属性和方法

constructor :保存着用于创建当前对象的函数

hasOwnProperty(propertyName) :用于检查给定的属性在当前对象实例中,参数的属性名( propertyName )必须以字符串形式指定

isPrototypeOf(object) :用于检查传入的对象是否是传入对象的原型

propertyIsEnumerable(propertyName) :用于检查给定的属性是否能够使用 for-in 语句来枚举

toLocaleString() : 返回地区

toString() :返回对象的字符串表示

valueOf() :返回对象的字符串、数值或布尔值表示

3.5 操作符

自增自减

  • 自增 ++
var msg = 10;
alert(++msg);
  • 自减 - -
var msg = 10;
alert(--msg);

执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的;

后置递增和递减操作是在包含它们的语句被求值之后才执行的

自增自减适用于各种数据类型

在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作。字
符串变量变成数值变量

在应用于一个不包含有效数字字符的字符串时,将变量的值设置为 NaN 字符串变量变成数值变量

在应用于布尔值 false 时,先将其转换为 0 再执行加减 1 的操作。布尔值变量变成数值变量

在应用于布尔值 true 时,先将其转换为 1 再执行加减 1 的操作。布尔值变量变成数值变量

在应用于浮点数值时,执行加减 1 的操作

在应用于对象时,先调用对象的 valueOf() 方法以取得一个可供操作的值。然后对该值应用前述规则

一元加减操作符

  • 加法 +
  • 减法 -

在对非数值应用一元加操作符时,该操作符会像 Number() 转型函数一样对这个值执行转换

位操作符

ECMAScript先将 64 位的值转换成 32 位的整数,然后执行操作,最后再将结果转换回 64 位

对于有符号的整数,32 位中的前 31 位用于表示整数的值。第 32 位用于表示数值的符号:0 表示正
数,1 表示负数。这个表示符号的位叫做符号位

负数同样以二进制码存储,但使用的格式是二进制补码

求这个数值绝对值的二进制码

求二进制反码,即将 0 替换为 1,将 1 替换为 0

得到的二进制反码加 1

var msg = 10;
// 1010
alert(msg.toString(2));
  • 按位非(NOT)用 ~ 表示,取得数值反码;按位非操作的本质:操作数的负值减 1;
var msg = 10;
// -11
alert(~msg);
  • 按位与(AND) 用 & 表示
  • 按位 或(OR) 用 | 表示
  • 按位 异或 (XOR)用 ^ 表示
  • 左移 <<
  • 右移 >>
  • 无符号左移 <<<
  • 无符号右移 >>>

布尔操作符

  • 逻辑非(NOT)操作符由一个叹号(!)表示,非布尔操作情况逻辑非操作符遵循下列规则

如果操作数是一个对象,返回 false ;
 如果操作数是一个空字符串,返回 true ;
 如果操作数是一个非空字符串,返回 false ;
 如果操作数是数值 0,返回 true ;
 如果操作数是任意非 0 数值(包括 Infinity ),返回 false ;
 如果操作数是 null ,返回 true ;
 如果操作数是 NaN ,返回 true ;
 如果操作数是 undefined ,返回 true

逻辑非操作符也可以用于将一个值转换为与其对应的布尔值。而同时使用两个逻辑非操作符,实际
上就会模拟 Boolean() 转型函数的行为;第一个逻辑非操作会基于无论什么操作数返回一个布
尔值,而第二个逻辑非操作则对该布尔值求反;

alert(!!0); //false
  • 逻辑与操作符由两个和号( && )表示

有一个操作数不是布尔值的情况,它遵循下列规则

 如果第一个操作数是对象,则返回第二个操作数;
 如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该
对象;
 如果两个操作数都是对象,则返回第二个操作数;
 如果有一个操作数是 null ,则返回 null ;
 如果有一个操作数是 NaN ,则返回 NaN ;
 如果有一个操作数是 undefined ,则返回 undefined

如果第一个操作数是 false ,则无论第二个操作数是什么值都不会执行返回false;

  • 逻辑或操作符由两个竖线符号( || )表示

如果有一个操作数不是布尔值,它遵循下列规则

 如果第一个操作数是对象,则返回第一个操作数;
 如果第一个操作数的求值结果为 false ,则返回第二个操作数;
 如果两个操作数都是对象,则返回第一个操作数;
 如果两个操作数都是 null ,则返回 null ;
 如果两个操作数都是 NaN ,则返回 NaN ;
 如果两个操作数都是 undefined ,则返回 undefined 。

如果第一个操作数的求值结果为true ,就不会对第二个操作数求值了,直接返回true;

乘法

乘法操作符由一个星号( * )表示

在处理特殊值的情况下,乘法操作符遵循下列特殊的规则

如果操作数都是数值,执行常规的乘法计算,即两个正数或两个负数相乘的结果还是正数,而
如果只有一个操作数有符号,那么结果就是负数。如果乘积超过了 ECMAScript 数值的表示范围,
则返回 Infinity 或 -Infinity ;
 如果有一个操作数是 NaN ,则结果是 NaN ;
 如果是 Infinity 与 0 相乘,则结果是 NaN ;
 如果是 Infinity 与非 0 数值相乘,则结果是 Infinity 或 -Infinity ,取决于有符号操作数
的符号;
 如果是 Infinity 与 Infinity 相乘,则结果是 Infinity ;
 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的
规则。

除法

除法操作符由一个斜线符号(/)表示

对特殊的值也有特殊的处理规则

 如果操作数都是数值,执行常规的除法计算,即两个正数或两个负数相除的结果还是正数,而
如果只有一个操作数有符号,那么结果就是负数。如果商超过了 ECMAScript 数值的表示范围,
则返回 Infinity 或 -Infinity ;
 如果有一个操作数是 NaN ,则结果是 NaN ;
 如果是 Infinity 被 Infinity 除,则结果是 NaN ;
 如果是零被零除,则结果是 NaN ;
 如果是非零的有限数被零除,则结果是 Infinity 或 -Infinity ,取决于有符号操作数的符号;
 如果是 Infinity 被任何非零数值除,则结果是 Infinity 或 -Infinity ,取决于有符号操作
数的符号;

如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则

求模

求模(余数)操作符由一个百分号( % )表示

 如果操作数都是数值,执行常规的除法计算,返回除得的余数;
 如果被除数是无穷大值而除数是有限大的数值,则结果是 NaN ;
 如果被除数是有限大的数值而除数是零,则结果是 NaN ;
 如果是 Infinity 被 Infinity 除,则结果是 NaN ;
 如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
 如果被除数是零,则结果是零;
 如果有一个操作数不是数值,则在后台调用 Number() 将其转换为数值,然后再应用上面的规则

加法

加法操作符(+)

数值规则

 如果有一个操作数是 NaN ,则结果是 NaN ;
 如果是 Infinity 加 Infinity ,则结果是 Infinity ;
 如果是 -Infinity 加 -Infinity ,则结果是 -Infinity ;
 如果是 Infinity 加 -Infinity ,则结果是 NaN ;
 如果是+0 加+0,则结果是+0;
 如果是0 加0,则结果是0;
 如果是+0 加0,则结果是+0。

一个操作数是字符串

 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来;
 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接
起来

如果有一个操作数是对象、数值或布尔值,则调用它们的 toString() 方法取得相应的字符串值,
然后再应用前面关于字符串的规则

减法

减法操作符(-)

规则

 如果两个操作符都是数值,则执行常规的算术减法操作并返回结果;
 如果有一个操作数是 NaN ,则结果是 NaN ;
 如果是 Infinity 减 Infinity ,则结果是 NaN ;
 如果是 -Infinity 减 -Infinity ,则结果是 NaN ;
 如果是 Infinity 减 -Infinity ,则结果是 Infinity ;
 如果是 -Infinity 减 Infinity ,则结果是 -Infinity ;
 如果是+0 减+0,则结果是+0;
 如果是+0 减0,则结果是0;

 如果是0 减0,则结果是+0;
 如果有一个操作数是字符串、布尔值、 null 或 undefined ,则先在后台调用 Number() 函数将
其转换为数值,然后再根据前面的规则执行减法计算。如果转换的结果是 NaN ,则减法的结果
就是 NaN ;
 如果有一个操作数是对象,则调用对象的 valueOf() 方法以取得表示该对象的数值。如果得到
的值是 NaN ,则减法的结果就是 NaN 。如果对象没有 valueOf() 方法,则调用其 toString()
方法并将得到的字符串转换为数值。

关系操作符

  • 小于(<)
  • 大于(>)
  • 小于等于(<=)
  • 大于等于(>=)

非数值规则

 如果两个操作数都是数值,则执行数值比较。
 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
 如果一个操作数是对象,则调用这个对象的 valueOf() 方法,用得到的结果按照前面的规则执
行比较。如果对象没有 valueOf() 方法,则调用 toString() 方法,并用得到的结果根据前面
的规则执行比较。
 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。

等于

  • 等于 ==
  • 不等于 !=
  • 全等 === 它只在两个操作数未经转换就相等的情况下返回 true

在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则

如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值—— false 转换为 0,而
true 转换为 1;
如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法,用得到的基本类
型值按照前面的规则进行比较;
这两个操作符在进行比较时则要遵循下列规则。
 null 和 undefined 是相等的。
 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值。
 如果有一个操作数是 NaN ,则相等操作符返回 false ,而不相等操作符返回 true 。重要提示:
即使两个操作数都是 NaN ,相等操作符也返回 false ;因为按照规则, NaN 不等于 NaN 。
 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,
则相等操作符返回 true ;否则,返回 false

条件操作符

variable = boolean_expression ? true_value : false_value;

如果求值结果为 true ,则给变量 variable 赋 true_value 值;如果求值结果为 false ,则给变量 variable 赋 false_value 值

赋值操作符

赋值操作符由等于号( = )表示

复杂操作

 乘/赋值( *= );
 除/赋值( /= );
 模/赋值( %= );
 加/赋值( += );
 减/赋值( = );
 左移/赋值( <<= );
 有符号右移/赋值( >>= );

 无符号右移/赋值( >>>= )

var num1 =1, num2 = 2;

3.6 语句

if 语句

格式一

if (condition) statement1 else statement2

格式二

if (condition1) statement1 else if (condition2) statement2 else statement3

do-while 语句

格式

do {
statement
} while (expression);

while 语句

while(expression) statement

for 语句

格式

for (initialization; expression; post-loop-expression) statement

无限循环

for (;;) { // 无限循环
doSomething();
}

for-in 语句

枚举迭代;建议在使用 for-in 循环之前,先检测确认该对象的值不是 null 或 undefined

格式

for (property in expression) statement

label 语句

label: statement

加标签的语句一般都要与 for 语句等循环语句配合使用,使用 break, continue引用跳出循环;

with 语句

with 语句的作用是将代码的作用域设置到一个特定的对象中

with (expression) statement;

switch 语句

switch 语句中使用任何数据类型

每个 case 的值不一定是常量,可以是变量,甚至是表达式

switch (expression) {
case value: statement
break;
case value: statement
break;

default: statement
}

3.7 函数

函数使用 function 关键字来声明,后跟一组参数以及函数体

格式

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

示例

function hello(msg) {
            alert("hello"+msg);
}

调用示例

hello(10);

带有返回值示例

function sum(num1, num2) {
return num1 + num2;
}

调用示例

var val = sum(10,20)

位于 return 语句之后的任何代码都永远不会执行

参数理解

原因是 ECMAScript 中的参数在内部是用一个数组来表示,不在乎是否真的传递参数的个数;

function sum() {
	// 30
    alert(arguments[0] + arguments[1])
    // 2
    alert(arguments.length)
        }
sum(10,20)

如果只传参一个值,获取arguments[1] 值就是 undefined ;

如果在函数内部对 arguments[index] 进行重新赋值,也会修改对应参数列表位置的值;

没有重载

同名函数根据定义的顺序起作用,后面定义的函数会覆盖前面定义的函数;

相关文章