js了解
- chorme :v8最快
- js的特点
- 解释性语言(不用编译)
- 类似于c和Java的语法结构
- 动态语言
- 基于原型的面向对象
js三条语句
下面三条都写得话,从上到下依次执行,即进行第一个之后点确定才会执行达其他两个
- alert(“这只我的第一行js代码”);
- document.write(“看我出不出来~~~”);
- console.log(“你猜我在哪出来呢?”);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- js代码需要编写到script标签中 -->
<script type="text/javascript">
// <!-- 控制浏览器弹出一个警告框 -->
alert("这只我的第一行js代码");
// 让计算机在页面中输出一个内容
// document.write().可以向body中输出一个内容
document.write("看我出不出来~~~");
// 向控制台输出一个内容
// console.log()的作用是向控制台输出一个内容
console.log("你猜我在哪出来呢?");
</script>
</head>
<body>
</body>
</html>
js编写位置(三种)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 可以将js代码编写到外部js.js文件中,然后通过script标签引入
写到外部文件中可以在不同的页面中同时使用,也可以利用浏览器的缓存机制,推荐使用的方式-->
<!--
script标签一旦用于引入外部文件了,就不能在编写代码了,即使编写了浏览器也会忽略
如果需要则可以创建一个新的script标签用于编写内部代码
-->
<script type="text/javascript" src="地址">即这里不能写</script>
<script type="text/javascript">
alert("我是内部的js中的代码!");
</script>
<!--
可以将js代码编写到script标签中
<script type="text/javascript">
alert("我是script标签中的代码!!");
</script> -->
</head>
<body>
<!-- 可以将js代码编写到button标签的onclick属性中 -->
<!-- 当我们点击按钮时,js代码才会执行 -->
<!--
虽然可以写在标签的属性中,但是他们属于结构与行为耦合,不方便维护,不推荐使用
-->
<button onclick="alert('讨厌,你点我干嘛~~')"></button>
<!--
可以将js代码写在超链接href属性中,这样当点击超链接时,会执行js代码
-->
<a href="javascript:alert('让你点你就点!!')">你也点我一下~~</a>
<a href="javascript:;">你也点我一下</a>
</body>
</html>
js注释
/*
js 注释
多行注释,注释中的内容不会被执行,但是可以在源代码中查看
要养成良好的编写注释的习惯,也可以通过注释来对代码进行一些简单的调试
*/
// 单行注释
// 1.js中严格区分大小写
// 2.js中每一条语句以分号结尾(;)
// 如果不写分号,但会消耗一些系统资源
// 而且有些时候,浏览器回加错分号,所以在开发中分号必须加
// 3.js中会忽略多个空格和换行,所以我们可以利用空格和换行对代码进行格式化
字面量和变量
<title>Document</title>
<script type="text/javascript">
/*
字面量,都是一些不可改变的值
比如:1 2 3 4 5
字面量都是可以直接使用,但是我们一般不会直接使用字面量
变量 变量可以用来保存字面量,而且变量的值是可以任意改变的
变量更加方便我们使用,所以在开发中都是通过变量去保存一个字面量
而很少直接使用字面量
可以通过变量对字面量进行描述
*/
// 声明变量
// 在js中使用var关键字来声明一个变量
var a;
//为变量赋值
a = 123;
a = 456;
console.log(a);
//声明和赋值同时进行
var a = 123;
</script>
标识符
<title>Document</title>
<!--
****标识符****
1.在js中所有的可以由我们自主命名的都可以命名为标识符
例如:变量名,函数名,属性名都属于标识符
命名一个标识符需要遵循如下的规则:
1.标识符中可以含有字母,数字,下划线,$
2.标识符不能以数字开头
3.标识符不能是ES中的关键字(var,if)或保留字(可能会用,class等)
4.标识符一般都采用驼峰命名法
首字母小写,每个单词的开头字母大写,其余字母小写
helloWorld xxxYyyZzz
js底层保存标识符实际上是采用unicode编码
所以理论上讲,所有的utf-8中含有的内容(锄禾日当午,但千万不要这么写)都可以作为标识符
-->
<script type="text/javascript">
var 锄禾日当午 = 234;
console.log(锄禾日当午);
</script>
</head>
number
-
1.在JS中所有的数值都是Number类型,包括整数和浮点数(小数)
-
2.var a =123; var b=“123”;console.log输出都是123;
可以使用一个运算符typeof来检查一个变量的类型 语法:typeof 变量 console.log(typeof a);
检查字符串时,会返回string,检查数值时,会返回number; -
3.console.log(Number.MAX_VALUE);Number.MAX_VALUE,JS中可以表示的数字的最大值(1.7976931348623157+308)
如果使用一个Number表示的数字超过了最大值,则会返回一个Infinity,表示正无穷,自面量;-Infinity,表示负无穷
使用typeof检查也Infinity会返回Number -
4.var a=“123” * “123”;输出类型是一个NaN,NaN是一个特殊的数字,表示Not A Number,使用使用typeof检查也NaN会返回Number
-
5.console.log(Number.MIN_VALUE);5e-324大于零的最小值
-
6.在js中整数的运算基本可以保持精确,如果使用js进行浮点运算,可能得到一个不精确的结果,所以千万不要使用js进行对精确度要求比较高的运算
字符串
1.数据类型指的就是字面量的类型
2.在js中一共有六种数据类型(五种基本数据类型)
string 字符串
Number 数值
Boolean 布尔值
Null 空值
undefined 未定义
Object 对象
其中 string Number Boolean Null undefined 属于基本数据类型,以后我们看到的值只要不是上面的五种,全都是对象
而Object属于引用数据类型
3.字符串:
在js中字符串需要使用引号引起来
var str = "hello";
使用双引号或者单引号,但是不要混用
引号不能嵌套,双引号里面不能放双引号,单引号里面不能放单引号,但是双引号里面可以放单引号,反之也成立
如果必须用俩双引号:在字符串中使用\作为转义字符
\" \' \n \t \\(成倍写) 与c相同
//输出字面量str
alert("str");
//输出变量str
alert(str);
Boolean 布尔值
- 布尔值只有两个
true:表示真
false:表示假
var bool = true; console.log(typeof bool);
- 使用t6ypeof检查一个布尔值时,会返回一个boolean
Null和Undefined
-
Null类型的值只有一个,就是null
-
null这个值专门用来表示一个为空的对象
var a =null; console.log(typeof a);
-
使用typeof检查一个null值时,会返回object;
-
Udefined(未定义,声明未赋值)类型的值只有一个,就是Undefined
var a = null;var b; console.log(b);
-
当声明一个变量,但是并不给变量赋值时,它的值就是undefined
-
使用typeof检查一个Undefined时也会返回undefined;
强制类型转换
- 只将一个数据类型强制转换为其他的数据类型
- 类型转换主要指,将其他的数据内型,转换为
string,Number,Booleanstring
方式一:- 调用被转换数据类型的toString()方法
- 该方法不会影响到原变量,它会将转换的结果返回
- 局限但是注意,null和undefined这两个值没有toString()方法,如果调用他们的方法,会报错
var a = 123;
调用a的toString()方法,调用xxx的yyy()方法,就是xxx.yyy();
a.toString();
var a = 123;
var b/a = a.toString();
console.log(typeof b/a);string
console.log( b);123
a=null;
a=a.toString();报错
方式二:
- 调用string()函数,并将被转换的数据作为参数传递给函数;
- 使用String()函数做强制类型转换时,对于Number和Boolean实际上就是调用的toString()方法,但是对于null和undefined,就不会调用toString()方法,他会将null直接转换为"null",将undefined直接转换为"undefined",即 null,undefined也可以转换
var a = 123;
//调用string函数,来将a转换为字符串
a = string(a);
console.log(typeof a);
Number
方式一:
- 使用Number()函数
字符串转数字: - 1,如果是纯数字的字符串,则直接将其转换为数字
- 2,如果字符串中只要有非数字的内容,则转换为NaN
- 3,如果字符串是一个空串或者是一个全是空格的字符,则转换为0
布尔转数字 - true—>1
- false—>0
Null转成数字为0
undefined转成数字为NaN
var a ="123";
//调用Number()函数来将a转换为Number类型
a = Number(a);
console.log(typeof a);number
console.log(a);123
//如果是
var a = "abc";
a = Number(a);
console.log(typeof a);number
console.log(a);NaN(不是一个数字);
方式二:
- 这种方式专门用来对付字符串
parseInt()
把每一个字符串转换为一个整数parseFloat()
把一个字符串转换为一个浮点数
//问题1:取整数
var a ="123px";
a = Number(a);
console.log(a);NaN
解决:
var a ="123px";
调用parseInt()函数将a转换为Number
parseInt()可以将一个字符串中有效的整数内容读出来(遇到第一个不是数字的就不读了),然后转换为Number
a = parseInt(a);
console.log(typeof a);number
console.log(a);123
//问题二:取小数
var a ="123.456.789px";
a = parseFloat(a);
console.log(typeof a);number
console.log(a);123.456
解析:如果对非string使用parseInt()和parseFloat(),它会先将其转换为string,然后在操作
a = true;
a = parseFloat(a);"true"一样
console.log(typeof a);number
console.log(a);NaN
//问题三:间接取整
a = 123.45;
a = parseInt(a);"123.45"一样
console.log(typeof a);number
console.log(a);123
其他进制的数字
var a =123;
//在js中,如果需要表示16进制的数字,则需要以0x开头
a = 0x10;16
a = 0xff;255
console.log(a);
//如果需要表示8进制的数字,则需要以0开头
a = 070;56
//如果需要表示二进制的数字,则需要以0b开头,但不是所有的浏览器都支持,火狐,谷歌支持
a = 0b10;2
//问题:像"070"这样的字符串,有些浏览器会当成8进制转换,有些会当成10进制转换
a = "070";
a = parseInt(a);
console.log(typeof a);
console.log(a);70/56
解决:可以在parseInt()中传递一个第二个参数,来指定数字的进制
a = parseInt(a,10);
Boolean
方式一: 使用Boolean()函数
数字转布尔
- 除了0和NaN,其余的都是true
字符串转布尔 - 除了空串,其余的都是true
null和undefined都会转换为false - 对象也会转换为true
var a = 123;
//调用Boolean()函数来将a转换为布尔值
a = Boolean(a);
console.log(typeof a);
console.log(a);
方式二:(隐式类型转换)
- 为任意的数据类型做两次非运算,即可将其转换为布尔值
- 例子:
var a = "hello" a = !!a;
算数运算符
- 运算符也叫操作符
- 通过运算符可以对一个或多个值进行运算,并获取运算结果,比如:typeof就是运算符,可以来获得一个值的类型,它会将该值的类型以字符串的形式返回
string Number Boolean Null Object
var a =123;
var result = typrof a;
console.log(typrof a);number
console.log(typrof result);string
算术运算符
“+” “-” “*” “/” “%”
在加法中:
- 当对非Number类型的值进行运算时,会将这些值转换为Number,然后进行运算(除了字符串加法)
var a = true + false;1 2+null;2 true + 1;2
- 任何数和NaN做运算,结果都是NaN
2 + NaN;NaN
- 如果对两个字符串进行加法运算,则会做拼串操作,即将两个字符串合并输出(字符串太多想要换行,但是引号不能换行,所以可以使用加号,进行输出)
"123"+"456" = 123456;string "你好"+"世界"=你好世界
- 任何值和字符串做加法运算,都会先转换为字符串,然后再和字符串做拼串的操作
result = 123 + "1";1231 result = true + "hello";truehello
我们可以利用这一特点,来将一个任意的数据类型转换为string,我们只需要为任意的数据类型 + 一个""(空串)即可将其转换为string,这是一种隐式的内型转换,由浏览器自动完成,实际上他也是调用string()函数
var c = 123; c = c + "";与c = string(c);本质相同
练习:
var result = 1 + 2 +"3";33 var result = "1" + 2 + 3;123
在减法中:可以将两个值进行减法运算,并将结果返回
var a = 100 - "1";99
在乘法中:
var a = 2 * undefined;NaN;
//undefined先转换为number为NaN,任何值和NaN运算都是NaN
//null转换为number为0
在除法中:
var result =5 / 2;2.5
其他:
- 任何值做减乘除运算时都会自动转换为Number,我们可以利用这一特性做隐式的类型转换,可以通过为一个值-0 *1 /1来将其转换为Number(+0的话会进行拼串)
- 原理和Number()函数一样,使用起来更加简单
在取模中:
- 取余数
一元运算符
一元运算符,只需要一个操作数
“+”: 正号
- 正号不会对数字产生任何影响
“-”:负号
- 负号可以对数字进行负号的取反
- 对于非Number类型的值,它会将先转换为Number,然后在进行运算
var a = true;
a = -a;
console.log("a = "+a);-1
console.log(typeof a);number
- 可以对一个其他的数据内型使用+,来将其转换为number,它的原理和Number()函数一样
var a = "18";
a = +a;//在这里进行转换
console.log("a = "+a);18
console.log(typeof a);number
练习:
var result = 1 + "2" +3;
console.log("result = "+result);"123"
var result = 1 + +"2" +3;//使用+可以将任意的一个数据类型转换为number
console.log("result = "+result);6
自增和自减
自增:++
- 通过自增可以使变量在自身的基础上增加1
- a++与++a用法与c语言相同
var d = 20;
var result = d++ + ++d + d;20+22+22
console.log("result = "+result);
d = d++;20
逻辑运算符
JS 中为我们提供了三种逻辑运算符
布尔值
- !非
所谓非运算就是指对一个布尔值进行取反操作,true变false,false变true
如果对一个值进行两次取反,它不会变化
a = !!a;
- 如果对非布尔值进行取反,则会将其转换为布尔值,然后再取反,所以我们可以利用该特点,来将一个其他的数据类型转换为布尔值
var b = 10;true
b = ! b;false
console.log("b = "+b);
console.log(typeof b);
- 可以为一个任意数据类型去两次反,来将其转换为布尔值,原理和Boolean()函数一样
- && 与
&&可以对符号两侧的值进行运算并返回结果
运算规则:两个值只要有一个false,就false
var result =true && true;true
var result =false && true;false
JS中的与为短路的与:
true && alert("看我出不出来!");//出来
false && alert("看我出不出来!");//不出来
- || 或
- 运算结果:
两个都是false,才返回false
var result =true || true;true
var result =false || true;true
- JS中的或为短路的或:
false || alert("123");显示
true || alert("123");不显示
非布尔值的与或运算
&&
- 对于非布尔值进行与或运算时,会先将其转换为布尔值,然后再运算,并且返回原值
- true && true与运算,如果两个值都为true,则返回后面的
var result = 2 && 1;
console.log("result = " +result);1
var result = 0 && 2;0
var result = 2 && 0;0
- 与运算,如果两个值中有false,则返回靠前的false
var result = NaN && 0;NaN
var result = 0 && NaN;0
- 如果第一个为true,则必然返回第二个值
- 如果第一个值为false,则直接返回第一个值
|| - 如果第一个值为true,则直接返回第一个值
result = 2 || 1;2
- 如果第一个值为false,则直接返回第二个值
result = NaN || 1;1
空串转成布尔值为false
赋值运算符
- 可以将符号右侧的值赋给符号左侧的变量
- +=,-=,*=,/=与c相同,他们都是一个运算符
var a =123;
a += 5;
关系运算符
数值情况:
- 通过关系运算符可以比较两个值的大小关系,如果关系成立它会返回true,如果关系不成立则返回false
>
var result = 5>10;false
result = 5>4;true
console.log("result = "+result);
>=
<
<=
非数值情况:
-对于非数值进行比较时
console.log(1 > true);false
console.log(1 >= true);true
console.log(1 > "0");true
console.log(10 > null);true
- 任何值和NaN作任何比较都是false
console.log(10 > "hello");false
console.log(true > false);true
- 如果比较符号两侧的值都是字符串时,不会将其转换为数字进行比较,而会分别比较字符串中字符的Unicode编码
console.log("11" < "5");true
//这里是5>1,所以true
//如果比较的两个字符串型的数字,可能会得到不可预期的结果,在比较两个字符串类型的数字时,一定一定要转型
console.log("11" < "5");true
解决:
console.log("11" < +"5");
console.log("a" > "b");false
//比较字符编码时是一位一位进行比较
console.log("abc" < "b");true
//如果两位一样,则比较下一位,所以借用他对英文进行排序
console.log("abc" < "bcd");true
Unicode编码表
- 在JS输出一个字符编码:在字符串中使用转义字符输入Unicode编码 \u四位编码
console.log("\u1C00");
- 在网页中使用unicode编码:&#编码;(这里的编码需要的时十进制)
- 查看,程序员(计算器)
相等运算符
相等
- 用来比较两个值是否相等,如果相等会返回true,否则返回false
- 使用==来做相等运算
- 当使用==来比较两个值时,如果值的类型不同,则会自动进行类型转换,将其转换为相同的类型,然后在比较
console.log("1" == 1);true
console.log(true == "1");true
//将字符串和布尔值都转成number
console.log(null == 0);false
//没有将null转成number
- undefined衍生自null,所以这两个值做相等判断时,会返回true
console.log(undefined == null);true
- NaN不和任何值相等,包括它本身
console.log(NaN == "1");false
console.log(NaN == NaN);false
- 判断b的值是否为NaN
console.log(b == NaN);
可以通过isNaN()函数来判断一个值是否是NaN,如果是NaN,返回true,否则返回false
console.log(isNaN(b));
不相等
- 用来比较两个值是否相等,如果不相等会返回true,否则返回false
- 使用!=来做不相等运算
- 不相等也会对变量进行自动的类型转换,如果转换后相等他也会返回false
===全等
- 用来判断两个值是否全等,他和相等类似,不同的是他不会进行类型转换,如果两个值的类型不同,直接返回false
!==不全等
- 用来判断两个值是否不全等,他和不等类似,不同的是他不会进行类型转换,如果两个值的类型不同,直接返回true
条件运算符
- 条件运算符也叫三元运算符
- 语法:
条件表达式?语句1:语句二; - 执行的流程:
条件运算符在执行时,首先对条件表达式进行求值
如果该值为true,则执行语句一,并返回执行结果
如果该值为false,则执行语句二,并返回执行结果 - 如果条件表达式的求值结果是一个非布尔值,会将其转换为布尔值,然后在进行运算,hello转成布尔值为true,空串转成布尔值为false
a > b ?alert("a大"):alert("b大");
//获取a和b中的最大值
var max = a > b ? a : b;
//获取a和b,c中的最大值
max = max > c? max : c;
//获取a和b,c中的最大值(一个语句)这种方法不推荐使用,阅读性差
var max = a > b?(a>c?a:c):(b>c?b:c);
运算符的优先级
- 运算符使用,可以分割多个语句,一般可以在声明多个变量时使用,使用,运算符可以同时声明多个变量
var a = 1,b = 1;
- 就和数学中一样,在JS中运算符也有优先级,比如,先乘除,后加减
- 在JS中有一个运算符优先级的表,在表中越靠上优先级越高,优先级越高越优先计算,如果优先级一样,则从左往右计算,可以只用()来改变优先级
语句
- 语句按照自上向下的顺序一条一条执行的,在JS中可以使用{}来为语句进行分组,同一个{}中的语句我们成为是一组语句,他们要么都执行,要么都不执行,一个{}中的语句我们也称为叫一个代码块,在代码块后面不用编写;了JS重的代码块,只有分组的作用,没有其他的用途,比如,在代码块中声明变量仍然可以使用
条件判断语句:if语句
- 流程控制语句:使程序可以根据一定的条件来选择执行
- 语句的分类:
1.条件判断语句
2.条件分支语句
3.循环语句- if语句与c语言相同
- if else与c语言相同
- if else if else if(这里想写多少都可以,值为true,执行当前语句,值为false,继续向下判断)与c相同 else该语句中,只会有一个代码块被执行,一旦代码块执行,则直接执行语句注意:写条件时不要从小到大写,这样后面的都会成为无效代码
条件分支语句:switch语句
- 记得加break,必须全等,字符和数字的话就不会执行
- 如果所有的比赛结果都为false,则执行default后的语句
while循环
//向页面中输出连续的数字
document.write(1+"<br/>");//页面中换行,br标签
document.write(2);
- 与c语言相同
- 死循环
- 该循环不会停止,除非浏览器关闭,死循环在开发中慎用
- 可以用break来终止循环
do while循环
do{
语句
}while(条件);
与c语言相同
for循环
- 与c语言相同
- 水仙花数153=1^3 + 5^3 +3^3
嵌套的for循环
- 与c相同
break和continue
break
- break关键字可以用来退出switch和循环语句
- if里面不能使用
- break只对离他最近的循环进行终止
- 可以为循环语句创建一个lable,来表示当前的循环
lable:循环语句,使用break时,可以在break后面跟一个lable,这样break将会结束指定的循环,而不是最近的
outer:
for(var i=0;i<5;i++){
console.log("外层循环"+i);
for(var j=0;j<5;j++){
break outer;
console.log("内层循环"+j);
}
}
continue
- 关键字,跳过当次循环,也是默认只会对离他最近的循环起作用
- lable也可用
- console.time(“计时器的名字”)可以用来开启一个计时器,他需要一个字符串作为参数,这个字符串将会作为计时器的标识
console.time(“test”); - console.timeEnd()用来停止一个计时器,需要一个计时器的名字作为参数
console.timeEnd(“test”);
对象的简介
-
string 字符串
Number 数值
Boolean 布尔值
Null 空值
undefined 未定义
Object 对象
其中 string Number Boolean Null undefined 属于基本数据类型,以后我们看到的值只要不是上面的五种,全都是对象
而Object属于引用数据类型 -
基本数据内型都是单一的值"hello" 123,值和值之间没有任何的联系
-
在JS中表示一个人的信息(name gender age)
var name = “孙悟空”;
var gender = “男”;
var age = 18;
如果使用基本数据类型的数据,我们所创建的变量都是独立,不能成为一个整体 -
对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性。
-
对象的分类:
1.内建对象
- 由ES标准中定义的对象,在任何的ES中都可以使用
- 比如:Math string number boolean function object…2.宿主对象
- 由JS运行环境提供的对象,目前来讲主要是浏览器提供的对象
- 比如:BOM(浏览器对象模型) DOM(文档对象模型)3.自定义对象
- 由开发人员自己创建的对象
对象的基本操作
创建对象
- 使用new关键字调用的函数,是构造函数constructor
- 构造函数是专门用来创建对象的函数
- 使用typeof检查一个对象时,会返回object
var obj = new Object();
console.log(typeof obj);object
- 在对象中保存的值称为属性
- 向对象添加属性
语法:对象,属性名 = 属性值
// 向obj中添加一个name属性
obj.name = "name";
// 向obj中添加一个gender属性
obj.gender = "男";
// 向obj中添加一个age属性
obj.age = 18;
- 读取对象中的属性
语法:对象.属性名
console.log(obj.gender);
- 如果读取对象中没有的数性,不会报错而是会返回undefined
console.log(obj.hello); undefined
-
在对象中保存的值称为属性
-
向对象中添加属性
语法:对象.属性名 = 属性值
//向对象中添加一个name属性
obj.name = "孙悟空";
属性名:
对象的属性名不强制要求遵守标识符的规范,什么乱七八糟的名字都可以使用,但是我们使用还是尽量按照标识符的规范去做
obj.var = "hello";
如果要使用特殊的属性名,不能采用.的方式来操作,需要使用另一种方式;语法:对象[“属性名”] = 属性值
读取时也要采用这种形式
obj["123"] = 789;
console.log(obj.123);报错
console.log(obj["123"]);
-
, [] new优先级最高
-
使用[]这种形式去操作属性,更加的灵活。在[]中可以直接传递一个变量,这样变量值是多少就会读取那个属性
obj["123"] = 789;
var n = "123";
console.log(obj[n]);789
属性值
- JS对象的属性值,可以是任意的数据类型,甚至也可以是一个对象
obj.test = true;
obj.test = null;
obj.test = undefined;
//创建一个对象
var obj2 = new Object();
obj.name = "孙悟空";
//将obj2设置为obj的属性
obj.test = obj2;
console.log(obj.test.name);猪八戒
in运算符
- 通过该运算符可以检查一个对象中是否含有指定的属性,如果有则返回true,没有则返回false
- 语法:“属性名” in 对象
//检查obj中是否含有test2属性
console.log("test2" in obj);false
console.log("name" in obj);true
基本数据类型和引用数据类型
基本数据类型
string 字符串
Number 数值
Boolean 布尔值
Null 空值
undefined 未定义
Object 对象
var a = 123;
var b = a;
a++;
console.log("a = "+a);124
console.log("b = "+b);123
引用数据类型
Object
var obj = new Object();
obj.name = "孙悟空";
var obj2 = obj;
obj.name = "猪八戒";
console.log(obj.name);猪八戒
console.log(obj2.name);猪八戒
- JS中的变量都是保存到栈内存中的
- 基本数据类型的值直接在栈内存中存储,值与值之间是独立存在,修改一个变量不会影响其他的变量
- 对象是保存在堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,而变量保存的是对象的内存地址(对象的引用),如果两个变量保存的是一个同一个对象引用,当通过一个变量修改属性时,另一个也会受到影响
- 修改为null的话不影响,自己断开,别人还指向地址
var obj = new Object();
obj.name = "孙悟空";
var obj2 = obj;
obj.name = "猪八戒";
//设置obj2为null
console.log(obj);object
//修改为null的话不影响,自己断开,别人还指向地址
console.log(obj2);null
- 当比较两个基本数据类型的值时,就是比较值,而比较两个引用数据内型时,他是比较的对象的内存地址,如果两个对象是一模一样的,但是地址不同,他也会返回false
var c = 10;
var d = 10;
console.log(c == d);true
var obj3 = new Object();
var obj4 = new Object();
obj3.name = "沙和尚";
obj4.name = "沙和尚";
console.log(obj3 == obj4);false
对象字面量
- 以前创建一个对象
var obj = new Object();
- 使用对象字面量来创建一个对象
var obj = {};
obj.name = "孙悟空";
console.log(obj.name);孙悟空
- 使用对象字面量,可以在创建对象时,直接指定对象中的属性
- 语法:{属性名:属性值,属性名:属性值…}
对象字面量的属性名可以加引号,也可以不加,建议不加,如果要使用一些特殊的名字,则必须加引号:“#@@#@32”
var obj2 = {name:"猪八戒",age:28};可以在逗号之后加换行,更加清晰
- 属性名和属性值是一组一组的名值对结构,名和值之间使用:连接,多个名值对之间使用,隔开,如果一个属性之后没有其他的属性了,就不要写,
var obj2 = {name:"猪八戒",
age:28,
gender:"男",
test:{name:"沙和尚"}
};