JS程序如何运行。
JS中的类型。
原子类型相关的built-in objects
变量、值、引用
数组
一、运行JS程序:
1、在浏览器运行:这时候需要写HTML文件将JS文件和HTML链接起来,使用的标签是< script>< /script>,但是在链接的时候有两种方式,一种是将< script>写在< head>部分,一种是将其写在< body>,这两种方式的js文件的具体写法不同。2、在命令行、服务器环境中运行:需要借助Node.js作为JS服务端的运行环境,并在存在交互的环境。
二、JS中的类型:
1、三个基本的概念:变量、值、引用变量引用值,值具有类型,所以在JS中变量是没有类型的,但是值是有类型的。
2、如何申明一个变量:申明关键字+变量名
申明关键字有:let(常用)const,var(不建议使用)。( 使用const申明的变量:a、在什么的时候必须赋一个值
b、赋值之后变量和值之间的引用关系也就不能改变了)
3、JS的值的类型(七种):前六种为原子性的值,最后一种不是原子类型(注意理解原子类型的内涵)
a.undefined
b.null
c.number
d.string
e.boolean
f.symbol
g.object
变量的类型可以通过typeof操作符得到,但是对于typeof有三种例外的情况:
a、对于没有申明的变量使用返回undefined(这样的目的是为了不会随意导致程序终止,但是如果是对这个变量的其他操作就会导致错误)。
b、对申明了但是没有复制的变量使用返回的也是undefined。
c、对于一个null变量使用typeof返回的是object。
JS中的类型介绍:
a、undefined:
只有一个值就是undefined。
b、null:
null类型只有一个值null。
null和undefined之间的区别:undefined表示的是一个变量的值目前还没有确定,而null表示的是一个变量本身就没有值或者说是具有一个空值。
c、boolean:
boolean有两个值:true和false。
d、number:
一般情况下JS中的数值都是number类型的,其使用的编码方式是IEEE Std 754-2008,并且都是占8个字节,不论是整数还是浮点数采用的都是浮点数的编码方式。
number类型的特殊点:
1、在申明数值的时候,数值前面的零可以省略,例如let a = .42是正确的。
2、如果数值太大可以使用指数的形式。
3、输出数字的时候,如果没有输出格式的控制,那么会省略无意义的0。
4、输出格式的控制:
- toExponential()方法会将一个数值转化为用指数形式表示的字符串。
- toFixed(NUMBER)方法精确小数点后面的NUMBER位。
- toPrecision(NUMBER)方法保证有NUMBER位的有效数字。
- 以上的方法调用的时候,调用的数值本身的数值和引用关系等都不变,只不过其返回的是相应数值的对应表达方式的String类型,也就是返回值都是String类型的。
5、number的类型:
二进制: | 0b或者0B |
---|---|
八进制: | 0o或者0O |
十六进制: | 0x或者0X |
使用浮点数的比较方法 | 设定精度,一般使用的是Number.EPSILON(2^-52) |
---|---|
Object.is(num1,num2)方法 | 从编码的角度判断两个数的值是否相等 |
Number.isInteger(num)方法 | 判断num是否为整数 |
Number.isSafeInteger(num)方法 | 判断一个数值是否肯定会被精确存储的整数,Number.MAX_SAFE_INTEGER(2^53-1)可被ES精确存储的最大的整数,Number.MIIN_SAFE_INTEGER表示可以被精确存储的最小的整数 |
NaN | let a = 10/undefined | NaN与任何数值都不相等,与自己也不相等(NaN是唯一一个不与自己相等的值) | Number.isNaN(NUM)可以判断一个数是否为NaN |
---|---|---|---|
Infinity | let a = 1/0 在C++中由于整数和浮点数的编码的方式是不同的,所以在什么正无穷的时候要用double a =1.0/0 | 向最近靠拢原则:当一个数值超出了JS中数值的表示范围,这个数会被存储为表示范围内最靠近的一个数 | Infinity/Infinity=NaN Infinity===Number.POSITIVE_INFINITY -Infinity===Numbr.NEGATIVE_INFINITY |
+0和-0 | +0和-0的数值相等,但是具有不同的码值 | 1/+0=Infinity 1/-0=-Infinity |
字符串在申明之后,其值就不会再发生改变,任何操作都不会改变字符串的值,这和JAVA是一样的,所以任意操作只是返回一个新的值,原来的值是不改变的。
字符串的表达方式:
a、使用双引号
b、使用“·”,可以直接插入换行且不用显式转义,并且可以嵌入表达式。
f、object:
包含一个或者多个property,一个property包括一个key和value值,key可以是string或者是symbol,任何JS类型的值都可以作为value。
object有两种类型:data object和accessor object
创建方式:
//创建方式一:对象字面量
let obj={ //或者let obj = {}; obj.name="xiao ming";
name:"xiao ming",
age:29,
addr:"peking univ"
}
//创建方式二:构造函数
let obj = new Object();
obj.name="xiao ming";
obj.age = 29;
obj.addr="peking univ";
访问property的value使用点操作符,删除某个property使用delete操作符。并且访问具有undefined值的property和访问未定义的property行为上是一样的,值是undefined,并且类型也是undefined。
对象字面量方式的特殊点:
a、语法糖现象:
//语法糖现象一
//带语法糖的方式:
let obj = {
name:"xiao ming",
age:20
}
console.log(obj.name);
//不带语法糖的形式,使用【】(方括号)操作符
let obj={
["name"] = "xiao ming",
["age"] = 20;
}
console.log(obj["name"]);
//语法糖现象二
//不使用语法糖
let name="xiao ming";
let age = 20;
let person={
name:name,
age:age
}
//使用语法糖
let name = "xiao ming";
let age= 20;
let person={
name,
age
}
三、原子类型相关的built-in objects(相当于Java中的装箱)
1、 什么是built-in objects:通过特定的constructor来构造 封装特定原子类型值的object,这些constructor就是built-in objects。
boolean | Boolean |
---|---|
number | Number |
string | String |
- 首先他们是object,并且还是特殊的built-in objects
- 他们是constructor
- 并且他们也是function
3、Object的特性:
首先Object是object,其次其作为constructor来申明object变量,最后其也是function,其作为function可以用来对原子类型的变量进行装箱。
4、Boolean,String,Number,Object使用举例:
//用法一:作为object
//这里举例的是Object和Number,其他应该也有自己的property,目前还没学到
let a = 10;
Number.isInteger(a);//判断某个数是不是整数
let b = 10;
Object.is(a,b);//从编码的角度看两个数是不是相等的
//用法二:作为constructor
//Boolean,Number,String作为constructor是对原子类型的变量进行装箱,要使用new
let a = new Boolean(true);
let b = new Number(42);
let c = new String("hello");
//Object作为constructor是申明object变量
let d = new Object();
//用法三,作为function使用
//Boolean,Number,String作为function使用的时候是作为强制类型转换
let a = Number("123");//a为number,并且a=123
let a = Number("hello");//a为number,并且其值为NaN
let a = Boolean(undefined);//a=false;如果为其他的值,有些是true,有些是false,具体进行判断
//一般特殊值NaN或者空字符串都转化为false
//同时也可以将Object转化为原子类型的,相当于拆箱工作,例如:
let a = String(new Number(58));
//Object作为function使用,其作用是对原子类型进行装箱
let a = Object(true);//a为object,相当于new Boolean(true)
//综上,将原子类型的值变为object的值有两种方法
//使用constructor
let a = new Boolean(true);
//使用Object的function特性
let a = Object(true);
封装了boolean的object有一个奇怪的特性:
let b = new Boolean(false);
if(b)
console.log("hello");
//会输出hello,因为object是一种像是真的值
//也就是对object进行真假判断,会将其视为真
既然有装箱,那么就会有拆箱:手动拆箱VS自动拆箱:
//手动拆箱
let a = new String("123");
a.valueOf();//得到“123”为字符串
//自动拆箱
let a = new String("123");
let b = a+"";//相当于a.valueOf()+""
四、变量、值、引用:
在申明变量的时候可能会用到const,const表示的是引用关系不能改变,也就是变量与其初始值之间的引用关系无法改变,但是不表示变量引用的值本身不能发生改变。在JS,赋值语句和函数调用的时候使用的是传引用,而对于原子类型的值,因为它们是immutable的,所以传值和传引用之间的表现差异并不是很明显,但是对于object就有会很大的差别。
五、创建数组
使用built-in objects,Array是一个built-in objects,其作为constructor可以申明JS中的原生数组(简称为数组)。 数组也是object,适合object的操作也适合数组数组的两种申明方式:
//方法一:数组字面量
const array = ["dog",false,NaN];//数组中可以存放不同类型的值
//方法二:数组作为构造函数
const array = new Array(3,2,1);
//但是当只有一个参数的时候会认为这个number是数组的长度,例如
const a = new Array(3);//a=[ , , ]
//那么如果是想用构造函数申明只有一个元素的数组怎么办?????
//使用Array.of(num):参数会被作为数组的元素存放在返回的数组中
//注意是返回的数组中!!!!!!!
let a = Array.of(0);
//a = [0];
对数组的操作:
push | 在末尾添加一个元素 |
---|---|
pop | 在末尾删除一个元素 |
unshift | 在开头添加一个元素 |
shift | 删除开头的元素 |
splice(start,deletecount,..item) | 从start开始删除deletecount个元素,然后将item加入数组中 |
slice(start,end) | 表示一个左闭右开的区间,返回数组的一个片段,在缺省的时候start为0,end为数组长度,所以可以用来复制数组 |