变量的扩展
定义变量
var number=20;
定义的变量代码,对于浏览器或者node来说,解释运行的时候,根据写的质量来动态的分配内存
内存特点:
在内存里面可以分配到一块空间,空间的名字:number,空旷里面存放的值:20
弱类型语言:在定义变量的时候,不需要定义这个变量所占用的内容空间大小,内存空间大小根据你的值来决定自动分配多大
强类型语言:在定义变量的时候一定要指定内存空间大小,空间不够数据无法全部存储,会出现异常或者数据丢失,如果自己定义的空间太大,空间浪费太多。java、c++
内存的单位
内存容量 | 描述 | 换算 |
BIT | 代表位,内存中最小的单位 | |
BYTE | 代表字节,默认情况为8位 | 1BYTE=8BIT |
KB | 常用的容量单位 | 1kb=1024byte |
MB | 1mb=1024kb | |
GB | ||
TB |
进制转换
二进制是计算机中描述数字的一种方式,也是机器能直接识别的语言。在计算机领域里面,存在很多种类型的数据。比如十进制(最符合人类思维的进制算法)、十六进制
计算机只能识别二进制,我们写程序都要转化为二进制, 让其在计算机上运行
代码在运行环境里面,会先将值转化为二进制放在内存里面存放。
在存放数字的时候,内存里面的最高位为符号位,一般不计算到值里面
存放的最大值为-128
数据类型
数据类型从内存角度来说表示定义当前这个变量在内存空间中的大小
数据类型可以区分程序中各种变量,比如商品:编号、类型(数字)名字、产地(字符串)、价格(浮点数)
每一种类型的值,都必须准确指定数据类型。
数据类型分类:
基本数据类型:number、boolean、string、undefined、null、Symbol(在代码中声明一个唯一的值)
引用类型(对象):日期、数组、集合等。引用类型表示对象。
原生对象:
number
number是js中设计出来表示整数和浮点数的类型
- 小数的表示方法
- 精度问题
Boolean
js中提供了一个Boolean的数据类型,表示真和假的意思。这个数据类型只有两个值。true false
在JavaScript语句中经常将这种值用在判断条件里面。
引用类型
js给我们提供的元素对象都是引用类型,我们在开发代码的时候,会用到js已经创建好的一些代码。
Array、Date、Number、Boolean、Object
数据类型转换
在开发中我们经常都会遇到数据类型需要进行运算。掌握数据类型的相互转化可以帮助我们在开发中完成各种业务设计。
- 数据类型自动转换
JavaScript支持数据类型自动转换,这种转换功能比较强大
- 数据类型强制转换
在开发中很多时候我们希望按照自己的数据类型计算,那就需要自己写代码将数据类型转换
- 将任何数据类型转化为字符串
- 将任何的数据类型和空字符串相加,最终结果就是字符串
- 拿到一个变量,调用toString()也会默认转化为字符串
- 将字符串转化为数字
- Number对象,js提供的一个对象,用来表示数字。不管是整数还是小数都是按照原来的值转化。
- parselnt()将字符串或者小数转为整数,最终结果一定整数。去尾
- 区别:都可以将字符串转化为数字,但是parselnt最终结果整数,在转换的过程中首先从第一个字符开始找,如果是数字那就继续往下找数字,找到非数字就停止返回找到的结果。一开始就非数字 返回NaN
- parseFloat()专门将数据转化为浮点数。从第一个字符开始找,找到数字和第一个小数点。
- 转化boolean值
- 非0 非空 非undefined 非空字符串 其他都是true
JavaScript-运算符
JavaScript能进行一系列的数据运算和逻辑运算。那就需要用到运算符。数学里面的运算符是一个概念。
算数运算符
+:加法运算
-:减法运算
*:乘法
/:除法
%:取模运算符(获取余数的一种运算符号)
++:自增
--:自减
运算符前后都有空格,标准规范
x++和++x:如果++是前缀,先计算x++的结果再整体运算。如果++是后缀,先整体运算再计算++x的值
JavaScript-函数
函数function
函数也是一个对象
函数中可以封装一些功能(代码),在需要时可以执行这些功能(代码)
函数中可以保存一些代码,在需要的时候调用
使用typeof检查一个函数对象时,会返回function
创建一个函数对象
可以将要封装的代码以字符串的形式传递给构造函数
var fun = new Function();
封装到函数中的代码不会立即执行
函数中的代码会在函数调用的时候执行
调用函数:
语法:
函数对象()
调用函数时,函数中封装的代码会按照顺序执行
使用函数声明来创建一个函数
语法:
function 函数名([形参1,形参2......形参N]{
语句
}
使用函数表达式来创建一个函数
语法:
var 函数名=function([形参1,形参2......形参N]{
语句
}
形参
可以在函数的()中指定一个或多个形参(形式参数)
多个形参之间使用,隔开,声明形参就相当于在函数内部声明了对应的变量,但是并不赋值
实参
在调用函数时,可以在()中指定实参(实际参数),实参将会赋值给函数中对应的形参
调用函数时解析器不会检查实参的类型,所以要注意,是否有可能会接收到非法的参数
调用函数时,解析器也不会检查实参的数量,多余的实参不会被赋值
如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined
实参可以是任意数据类型,也可以是一个对象
当我们的参数过多时,可以将参数封装到一个对象中,然后通过对象传递
函数的返回值
可以使用return来设置函数的返回值
语法:
return 值;
var return=函数名()
在函数中return后的语句都不会执行
如果return语句后不跟任何值就相当于返回一个undefined
如果函数中不写return,则也会返回undefined
return后可以跟任意类型的值
使用return可以结束整个函数
返回值可以是任意的数据类型,也可以是一个对象、函数
立即执行函数
函数定义完,立即被调用,这种函数叫做立即执行函数,立即执行函数往往只会执行一次
(函数名(形参){
语句
})(实参);
函数也可以称为对象的属性
如果一个函数作为一个对象的属性保存,那么我们称这个函数是这个对象的方法
调用这个函数就说调用对象的方法(method)
但是它知识名称上的区别,没有其他的区别
枚举对象中的属性
使用for...in语句
语法:
for(var 变量 in 对象){
}
for...in语句中,对象有几个属性,循环体就会执行几次
每次执行时,会将对象中的一个属性的名字赋值给变量
作用域
作用域指一个变量的作用的范围
在JS 中,一共有两种作用域
1、全局作用域
直接编写在script标签中的JS代码,都在全局作用域
全局作用域在页面打开时创建,在页面关闭时销毁
在全局作用域中有一个全局对象window,我们可以直接使用
它代表的是一个浏览器的窗口,它由浏览器创建,我们可以直接使用
在全局作用域中,创建的变量都会作为window对象的属性保存
创建的对象都会作为window对象的方法保存
全局作用域中的变量都是全局变量,在页面的任意部分都可以访问的到
变量的声明提前
使用var关键字声明的变量,会在所有的代码执行之前被声明(但不会赋值)
但是如果声明变量时不使用var关键字,则变量不会被声明提前
函数的声明提前
使用函数声明形式创建的函数function函数(){},它会在所有的代码执行之前就被创建,所以我们可以在函数声明前就调用函数
使用函数表达式创建的函数,不会被声明提前,所以不能在声明之前使用
2、函数作用域
调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
每调用一次函数,就会创建一个新的函数作用域,他们之间是相互独立的
在函数作用域中,可以访问到全局作用域的变量,在全局作用域中无法访问到函数作用域的变量
在函数作用域中也有声明提前的特性
使用var关键字声明的变量,会在函数中所有的代码执行之前被声明
函数声明也会在函数中所有的代码执行之前执行
在函数中,不使用var声明的变量都会成为全局变量
this
解析器在调用函数时每次都会向函数内部传递进一个隐含的参数
这个隐含的参数就是this,this指向的是一个对象,这个对象我们称为函数执行的上下文对象,根据函数的调用方式的不同,this会指向不同的对象
1、以函数的形式调用时,this永远都是window
2、以方法的形式调用时,this就是调用方法的那个对象
使用工厂方法创建对象
通过该方法可以大批量的创建对象
例:
function createPerson(name,age,gender){
//创建一个新的对象
var obj = new Object();
//向对象中添加属性
obj.name = name;
obj.age = age;
obj.gender = gender;
obj.sayName = function(){
alert(this.name);
};
//将新的对象返回
return obj;
}
var obj2 = createPerson("猪八戒",28,"男");
var obj3 = createPerson("白骨精",16,"女");
var obj4 = createPerson("蜘蛛精",18,"女");
obj2.sayName();
使用工厂方法构造的对象,使用的构造函数都是Object,所以创建的对象都是Object这个类型,就导致我们无法区分出多种不同类型的对象
创建一个构造函数,专门用来创建Person对象的
构造函数就是一个普通的函数,创建方式和普通函数没有区别,不同的是构造函数习惯上首字母大写
构造函数和普通函数额区别就是调用方式的不同
普通函数是直接调用,而构造函数需要使用new关键字来调用
构造函数的执行流程:
1、立刻创建一个新的对象
2、将新建的对象设置为函数中this,在构造函数中可以使用this来引用新建的对象
3、逐行执行函数中的代码
4、将新建的对象作为返回值返回
使用同一个构造函数创建的对象,我们称为同一类对象,也将一个构造函数称为一个类
我们将通过一个构造函数创建的对象,称为是该类的实例
function Person(name,age,gender){
this,name = name;
this.age = age;
this.gender = gender;
this.sayName = function(){
alert(this.name);
};
}
var per = new Person("孙悟空",18,"男");
var per2 = new Person("白骨精",16,"女");
var per 3= new Person("猪八戒",28,"男");
使用instanceof可以检查一个对象是否是一个类的实例
语法:
对象instanceof 构造函数
如果是,则返回true,否则返回false
所有的对象都是Object的后代
所以任何对象和Object做instanceof检查时都会返回true
this的情况:
1、当以函数的形式调用时,this是window
2、当以方法的形式调用时,谁调用方法this就是谁
3、当以构造函数的形式调用时,this就是新创建的那个对象
构造函数修改
创建一个Person的构造函数
在Person构造函数中,为每一个对象都添加了一个sayName方法,
目前我们的方法是在构造函数的内部创建的,也就是构造函数每执行一次就会创建一个新的sayName方法,也就是所有实例的sayName都是唯一的。
这样就导致了构造函数执行一次就会创建一个新的方法,执行一万次就会创建一万个新的方法,而这一万个方法都是一模一样的。这是完全没有必要的,完全可以使所有的对象共享一个方法
解决:将方法提取到全局作用域中
但会污染全局作用域,不易维护
原型prototype
我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype
这个属性对应着一个对象,这个对象就是我们所谓的原型对象
如果函数作为普通函数调用prototype没有任何作用,当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象,我们可以通过__proto__来访问该属性
原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中
当我们访问对象的一个属性或方法时,它会先在对象自身中寻找如果有则直接使用,如果没有则会去原型对象中寻找,如果有则直接使用
以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,这样不用分别为每一个对象添加,就可以使每个对象都具有这些属性和方法了。
可以使用对象的hasOwnProperty()来检查对象自身是否含有该属性
使用该方法只有当对象自身中含有属性时(不考虑原型对象),才会返回true
原型对象也是对象,所有它也有原型,当我们使用一个对象的属性或方法时,会先在自身中寻找,如果有则直接使用,如果没有去原型对象中寻找,如果有直接使用,如果没有则去原型的原型中寻找,直到找到Object对象的原型。
Object对象的原型没有原型,如果在Object中依然没有找到,则返回undefined
toString()
当我们直接在页面中打印一个对象时,实际上是输出的对象的toString()方法的返回值
如果我们希望在输出对象时不输出[object object],可以为对象添加一个toString()方法。
例:
per.toString=function(){
return 值;
}
修改Person原型的toString
Person.prototype.toString = function(){语句}
垃圾回收(GC)
就像人生活的时间长了会产生垃圾一样,程序运行过程中也会产生垃圾
这些垃圾积攒过多以后,会导致程序运行的速度过慢,所以我们需要一个垃圾回收的机制,来处理程序运行过程中产生的垃圾
当一个对象没有任何的变量或属性对它进行引用,此时我们将永远无法操作该对象,此时这种对象就是一个垃圾,这种对象过多会占用大量的内存空间,导致程序运行变慢,所以这种垃圾必须进行清理
在JS中拥有自动的垃圾回收机制,会自动将这些垃圾对象从内存中销毁,我们不需要也不能进行垃圾回收的操作
我们需要做的只是将不再使用的对象设置null即可
JavaScript-对象
JS中的数据类型
String 字符串
Number 数值
Boolean 布尔值
Null 空值
Undefined 未定义
以上五种类型属于基本数据类型,以后我们看到的值只要不是上面五种,全都是对象
Object 对象
基本数据类型都是单一的值,值和值之间没有任何的联系
如果使用基本数据类型的数据,我们所创建的变量都是独立的,不能成为一个整体
对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性
对象的分类:
1、内建对象
由ES标准中定义的对象,在任何的ES的实现中都可以使用
2、宿主对象
由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象
比如BOM DOM
3、自定义对象
由开发人员自己创建的对象
使用new关键字调用的函数,是构造函数constructor
构造函数是专门用来创建对象的函数
创建一个对象:var obj=new Obiect();
向对象添加属性:对象.属性名=属性值;
读取对象中的属性:对象.属性名;
修改对象的属性值:对象.属性名=新值;
删除对象的属性:delete 对象.属性名;
属性名
属性名不强制要求遵守标识符的规范
但使用时尽量按照标识符的规范
如果要使用特殊的属性名,不能采用.的方式来操作
语法: 对象["属性名"]=属性值
使用 [ ] 这种形式去操作属性,更加灵活,在[ ] 中可以直接传递一个变量,这样变量值是多少就会读取能够属性
属性值
JS对象的属性值,可以是任意的数据类型
in 运算符
通过该运算符可以检查一个对象中是否含有指定的属性
如果有则返回true,没有则返回false
语法:
"属性名" in 对象
JS中的变量都是保存到栈内存中的
基本数据类型的值直接在栈内存中存储
值与值之间都是独立存在,修改一个变量不会影响其他的变量
对象是保存在堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一块新的空间,而变量保存的是对象的内存地址(对象的引用),如果两个变量保存的是同一个对象引用,当一个通过一个变量修改属性时,另一个也会受到影响。
对象字面量
使用对象字面量来创建一个对象
var obj = { }
使用对象字面量,可以在创建对象时,直接指定对象中的属性
{属性名:属性值,属性名:属性值...}
对象字面量的属性名可以加""也可以不加,建议不加
如果要使用一些特殊的名字,则必须加""
JavaScript-语句
代码块
我们的程序是由一条一条语句构成的
语句是按照自上向下的顺序一条一条执行的
在JS中可以使用{}来为语句进行分组
同一个{}中的语句我们称为是一组语句(代码块),它们要么都执行,要么都不执行
代码块的后面不用再编写;
JS中的代码块,只具有分组的作用,没有其他用途
流程控制语句
JS中的程序是从上到下一行一行执行的
通过流程控制语句可以控制程序执行流程,使程序可以根据一定的条件来选择执行
语句的分类:
1、条件判断语句
2、条件分支语句
3、循环语句
条件判断语句:
使用条件判断语句可以在执行某个语句之前进行判断
如果条件成立才会执行语句,条件不成立则语句不执行
if语句
//语法一:
if(条件表达式){
语句
}
//语法二:
if(条件表达式){
语句
}else{
语句
}
//语法三:
if(条件表达式){
语句
}else if(条件表达式){
语句
}else if(条件表达式){
语句
}else{
语句
}
prompt()可以弹出一个提示框,该提示框中会带有一个文本框,用户可以在文本框中输入一段内容,该函数需要一个字符串作为参数,该字符串将会作为提示框的文字。
用户输入的内容将会作为函数的返回值返回,可以定义一个变量来接收该内容。
var 变量名=prompt("字符串")
prompt()函数的返回值是String
条件分支语句
条件分支语句也叫switch语句
根据num的值,输出对应的中文
语法:
switch(n)
{
case 1:
执行代码块 1
break;
case 2:
执行代码块 2
break;
default:
与 case 1 和 case 2 不同时执行的代码
}
执行流程:
switch...case...语句
在执行时会依次将case后的表达式的值和switch后的条件表达式的值进行全等比较,如果比较结果为true,则从当前case处开始执行,结果为false,则继续向下比较。
所有比较结果都为false,则执行fefault后的语句
使用break可以退出switch语句
if和switch可以互相代替
循环语句
向页面中输出连续的数字
document.write(内容+"<br/>");
通过循环语句可以反复的执行一段代码多次
while循环
语法:
while(条件表达式){
语句
}
while语句在执行时,先对条件表达式进行求值判断,如果值为true,则执行循环体,循环体执行完毕以后,继续对表达式进行判断,如果为true,则继续执行循环体,以此类推,如果值为false,则终止循环。
do...while循环
语法:
do{
语句;
}while(条件表达式);
执行流程:
do...while语句在执行时,会先执行循环体,循环体执行完毕以后,再对while后的条件表达式进行判断,如果结果为true,则继续执行循环体,以此类推,如果结果为false,终止循环。
while先判断后执行,do...while先执行后判断
for循环
for语句,也是一个循环语句,也称为for循环
语法:
for(初始化表达式;条件表达式;更新表达式){
语句
}
嵌套for循环
break和cotinue
break关键字可以用来推出switch或循环语句
不能再if语句中使用break和continue
break关键字,会立即终止离它最近的循环语句
可以为循环语句创建一个label,来标识当前的循环
label:循环语句
使用break语句时,可以再break后跟着一个label
这样break将会结束指定的循环,而不是最近的。
continue关键字可以用来跳过当次循环
同样continue也是默认只会对最近的循环起作用
continue:label 跳过label循环的当次循环
console.time("计时器的名字")可以用来开启一个计时器
它需要一个字符串作为参数,这个字符串将会作为计时器的标识
console.timeEnd("")用来停止一个计时器
Math.sqrt();
可以通过Math.sqrt()对一个数进行开方
JavaScript-基础
- alert("内容");提示框
- document.write("内容");在body中输出一个内容
- console.log("内容");向控制台输出一个内容
- 可以将js代码编写到标签的onclick属性中:点击按钮时,js代码才会执行:
<botton οnclick="alect("内容")"></botton>
- 可以将js代码编写到超链接的href属性中:点击超链接时,js代码执行:
<a href="javascript:alert("内容");"></a>
虽然可以写在标签的属性中,但是他们属于结构与行为耦合,不方便维护,不推荐使用。
- 可以将js代码编写到外部js文件中,然后通过script标签引入。
/*
多行注释
多行注释
*/
//单行注释
- 要养成良好的编写注释的习惯,可以通过注释来对代码进行调试
- JS中严格区分大小写
- JS中每一条语句以分号(;)结尾
如果不写分号,浏览器会自动添加,但是会消耗一些系统资源,且有可能加错,所以开发中分号必须写。
- JS中会忽略多个空格和换行
所以我们可以利用空格和换行对代码进行格式化。
- 在js中使用var关键字来声明一个变量
标识符
- 在JS中所有的可以由我们自主命名的都可以称为是标识符
- 例如:变量名、函数名、属性名都属于标识符
- 命名一个标识符时需要遵守如下的规则:
- 标识符中可以含有字母、数字、_、$
- 标识符不能以数字开头
- 标识符不能是ES中的关键字或保留字
- 标识符一般采用驼峰命名法
- JS底层保存标识符时实际上是采用的Unicode编码,理论上讲,所有utf-8中含有的内容都可以作为标识符。
数据类型
数据类型指的就是字面量的类型
在JS 中一共由六种数据类型
String 字符串
Number 数值
Boolean 布尔值
Null 空值
Undefined 未定义
Object 对象
其中前五个属于基本数据类型,而Object属于引用数据类型
String字符串
在JS中字符串需要使用引号引起来,单双引号都可,但不能混着用。
字符串中可以使用\作为转义字符,表示一些特殊符号时可以使用\进行转义。
\n:换行
\t:制表符
\\:\
Number
在JS中所有的数值都是Number类型,包括整数和浮点数(小数)
JS中可以表示数字的最大值:Number.MAX_VALUE
如果使用Number表示的数字超过了最大值,则会返回一个Infinity,表示正无穷。-Infinity:负无穷
NaN是一个特殊的数字,表示不是一个数字。
可以使用一个运算符typeof来检查一个变量的类型
语法:typeof 变量
检查字符串时,返回string
检查数值时,返回number
如果使用JS进行浮点运算,可能得到一个不精确的结果
Boolean 布尔值
布尔值只有两个,主要用来逻辑判断
true
false
Null
Null类型的值只有一个,就是null
null这个值专门用来表示一个为空的对象
使用typeof检查一个null值时,会返回object
Undefined
Undefined类型的值只有一个,就是undefind
当声明一个变量,但是并不给变量赋值时,它的值就是undefined
使用typeof检查一个undefined时也会返回undefined
强制类型转换
指将一个数据类型强制转换为其他的数据类型
类型转换主要指,将其他的数据类型,转换为String Number Boolean
将其他的数据类型转换为String
方式一:调用被转换数据类型的toString()方法
变量.toString();
该方法不会影响到原变量
方法二:调用String函数,并将被转换的数据作为参数传递给函数
变量=String(变量);
将其他的数据类型转换为Number
方法一:使用Number()函数
变量=Number(变量);
字符串-->数字:
1、如果是纯数字字符串,直接将其转换为数字
2、如果字符串中由非数字的内容,则转换为NaN
3、如果字符串是一个空串或者是一个全是空格的字符串,则转换为0
布尔-->数字
true -->1
false-->0
Null-->数字 0
undefined-->数字 NaN
方法二:
专门用来对付字符串
parseInt()把一个字符串转换为一个整数
将字符串中的有效的整数内容取出来,转换为Number
parseFloat()把一个字符串转换为一个浮点数
在JS中,如果需要表示16进制的数字,则需要以0x开头
8进制的数字,则需要以0开头
2进制的数字,则需要以0b开头,不是所有浏览器都支持
可以在parseInt()传递一个第二个参数,来指定数字的进制
变量=parseInt(变量,进制数值);
将其他的数据类型转换为Boolean
使用Boolean()函数
数字-->布尔
除了0和NaN,其余都是true
字符串-->布尔
除了空串,其余都是true
null,undefined-->布尔
false
对象也会转换为true
方法二:
为任意的数据类型取反两次
运算符
运算符也叫操作符
通过运算符可以对一个或多个值进行运算
例:typeof就是运算符,可以来获得一个值的类型,以字符串的形式返回
算法运算符:
对非Number的值进行运算时,会先将值转换为Number再进行运算
任何值和NaN进行运算,结果都为NaN
+
+对两个值进行加法运算,并将结果返回
如果对两个字符串进行加法运算,会将两个字符串拼接为一个字符串并返回
任何的值和字符串做加法运算,都会先转换为字符串然后再和字符串拼接
任意数据类型加“”,即可转换为String类型
-
-对两个值进行减法运算,并将结果返回
非Number值转换为Number再进行运算
*
/
%取模运算(取余数)
一元运算符
一元运算符,只需要一个操作数
+正号
-负号
对于非Number类型的值
先将值转换为Number类型
自增:
通过自增可以使变量再自身的基础上增加1
自增分为两种,后++(a++)和前++(++a)
无论是a++和++a,都会立即使原变量的值自增1
a++的值等于原变量的值(自增前的值)
++a的值等于原变量自增后的值
自减:
无论是a--还是--a,都会立即使原变量的值自减1
a--是原变量的原值(自减前的值)
--a是原变量自减后的值
JS中为我们提供了三种逻辑运算符
!非
!可以用来对一个值进行非运算
所谓非原酸就是指对一个布尔值进行取反操作
true-->false false-->true
如果对一个值进行两次取反,不会变化
如果对非布尔值进行运算,则会将值转换为布尔值再进行运算
可以利用该特点将其他值转换为布尔值
&&与
&&可以对符号两侧的值进行与运算并返回结果
两个值中只要有一个值为false,就返回false
两个值都为true时,返回true
|| 或
&& || 非布尔值的情况
对于非布尔值进行与或运算时,
会先将其转换为布尔值,然后再运算,并且返回原值
与运算:如果两个值都为ture,则返回后面的
如果两个值都为false,则返回靠前的
赋值运算符
=:可以将符号右侧的值赋值给符号左侧的变量
+=:a+=5 等价于 a=a+5
*=
%=
关系运算符
通过关系运算符可以比较两个值之间的大小关系
关系成立返回true 关系不成立返回false
>
<
>=
<=
非数值的情况
会将其转换为数字,再比较
任何值和NaN做任何比较结果都是false
如果符号两侧的值都是字符串时,不会将其转换为数字进行比较,会分别比较两侧字符串的字符编码
编码
在字符串中使用转义字符输入Unicode编码
\u四位编码
在网页中使用Unicode编码

进制编码
相等运算符
相等运算符比较两个值是否相等,如果相等会返回true,否则返回false
使用==来做相等运算
使用==来比较两个值时,如果值的类型不同,则会自动进行类型转换,将其转换为相同的类型再比较
NaN不和任何值相等,包括它本身
可以通过isNaN()函数来判断一个值是否为NaN
不相等运算符
不相等用来判断两个值是否不相等,如果不相等会返回true,否则返回false
使用!=来做不相等运算符
全等运算符
===
用来判断两个值是否全等,如果两个值的类型不用,直接返回false
类型和值都相等,返回true
不全等运算符
!==
用来判断两个值是否不全等,如果两个值类型不相同,直接返回true
条件运算符
条件运算符也叫三元运算符
语法:
条件表达式?语句1:语句2;
执行流程:
条件运算符再执行时,首先对条件表达式进行求值,
如果该值为true,则执行语句1,并返回执行结果
如果该值为false,则执行语句2,并返回执行结果
,运算符
使用, 可以分割多个语句,一般可以在声明多个变量时使用
和数学中一样,在JS中运算符也有优先级
比如:先乘除 后加减
在JS中有一个运算符优先级的表,表中越靠上优先级越高,优先级越高越优先运算