js核心语法总结
1.变量
什么是变量?变量是存储信息(数据)的容器。
定义变量时不需要申明具体类型,其类型由赋值的变量决定;
变量的三要素:
1,数据类型:决定在内存中分配的空间
2,变量名:空间别名
3,值:空间中存储的数据
变量的三种定义方式?const、var、let三种定义变量方式的区别
1.const一般用来定义常量,一旦被定义就不可以被修改,而且必须初始化
2.var定义的变量可以修改,但是如果声明了不赋值就会输出undefined,不会报错
3.let是块级作用域,函数内部使用let定义后,对函数外部无影响
2.数据类型
js中有七种数据类型:
1.五种简单数据类型(基本数据类型) Number ,String,Boolean,Null,Undefined
简单类型(基本类型)的值在内存中占据固定大小的空间,被保存在栈内存中。(从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本);
2.一种 复杂数据类型(引用数据类型) Object (Array,Math,Data,Function)
3.symbol(es6)
小结
基本数据类型(值类型):number,string,boolean
复杂类型(引用类型):object
空类型:undefined,null
值类型的值存储在哪里? 栈中存储具体的值
引用类型的值存储在哪里?栈存放地址和堆中存放代码块
值类型赋值传递的是值。
`引用类型赋值,传递的是地址。`
2.1简单数据类型 Number 数值型
包含整数和浮点数
2.1.1.浮点数会自动转换为整数
let num =1.00;
console.log(num)//输出1,自动转换为了整数
2.1.2浮点数的最高精度是17位
let a = 0.1;
let b = 0.2;
console.log(a+b);//输出0.30000000000000004
2.1.3.NaN:非数字类型。
特点:① 涉及到的 任何关于NaN的操作,都会返回NaN
② NaN不等于自身。
2.1.4. isNaN() 函数用于判断是否是一个非数字类型,如果传入的参数是一个非数字类型,那么返回true,否则返回false
2.1.5.isNaN()函数传入一个参数,函数会先将参数转换为数值,如果参数类型为对象类型,会先调用对象的valueOf()方法,再确定该方法返回的值是否可以转换为数值类型,如果不能,再调用对象的toString()方法,再确定返回值
(valueOf() 返回原始值)
数值转换
Number( )转换为函数,可以用于任何数据类型
parseInt( ),将值转换为整数型
parseFloat( ),将值转换为浮点数型
2.2简单数据类型 String 字符串型
1.字符串类型中的单双引号的作用效果完全一样
2.字符串类型有length属性,可以取得字符串的长度
let str = 'hello world'
console.log(str.length)//输出 11,包含了空格
3.字符串的值是不可变的,要改变一个字符串的值,首先要销毁原来的字符串,再用另一个包含新值得字符串区填充该字符串;
字符串转换
String( ),转型函数,适用于任何数据类型(null、undefined还是自身)
toString( ),方法可以把一个逻辑值转换为字符串,并返回结果(null、undefined没有这个方法)
number.toLocaleString( ) ,把数字转换成本地格式的字符串
字符串的运算
字符串与数字相加,结果是字符串的拼接,在js里,字符串加一个加号+代表拼接的意思,-*/等运算存在隐式转换,将字符串转换为数值进行运算了
let str = '10';
let n = 5;
console.log(n + str);//510
console.log(n - str);//-5
2.3简单数据类型 Boolean 布尔值
1.只有两个值,true和false,用来判断
2.Boolean( ),将某个值转换为Boolean型
**.2.4简单数据类型 Null 空对象指针 **
如果定义了一个变量,但是想在以后把这个变量当做一个对象来用,那么最好将该对象初始化未null值
2.5简单数据类型 Undefined 未定义
1.只有一个值,即undefined,使用var声明了一个变量,但未给变量初始化值,那么这个变量的值就是undefined
2.调用函数时,应该提供的参数没有提供(没有传参),该参数就等于undefined
3.对象没有赋值的属性,该属性的值为undefined
4.函数没有返回值,默认返回undefined
2.6 Object类型 引用数据类型(复杂数据类型)
JS中的三种对象:
-
内置对象
Math,Date,String,Array,Object
内置对象中Math的常用方法 Math.PI Math.abs() Math.ceil()//取大值 Math.floor()//取小值 Math.max()//最大值 Math.min()//最小值 Math.pow() Math.sqrt() Math.random()//生成一个大于零小于一的随机数
-
自定义对象
-
浏览器对象
2.6.1 引用类型的值可以改变
let person = {
name: 'lisa'}
person.name = 'Jane' // 通过修改对象属性值更改对象
console.log(person) // 输出:{name: "Jane"}
person.age = 18 // 给对象增加一个属性
console.log(person) // 输出:{name: "Jane", age: 18}
let arr = [1, 2, 3, 4, 5]
arr[0] = 0 // 更改数组的某一个元素
console.log(arr) // 输出:[0, 2, 3, 4, 5]
arr[5] = 6 // 给数组增加一个元素
console.log(arr) // 输出:[0, 2, 3, 4, 5, 6]
2.6.2 引用类型可以添加属性和方法
let person = {
}
person.name = 'lisa'
person.say = function () {
alert('hello world')
}
console.log(person.name) // 输出:lisa
console.log(person.say) // 输出:function () { alert('hello world') }
2.6.3引用类型的赋值是对象引用
let a = {
}
let b = a
a.name = 'lisa'
console.log(a.name) // 输出:lisa
console.log(b.name) // 输出:lisa
b.age = 18
console.log(a.age) // 输出:18
console.log(b.age) // 输出:18
2.6.4当从一个变量向另一个变量赋值引用类型的值的时候,同样会将存储在变量中的对象的值复制一份到为新变量分配的空间中,引用类型保存在变量中的是在堆内存中的地址。所以,与基本数据类型的简单赋值不同,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存中的一个对象,那么赋值操作后,两个变量都保存了同一个对象的地址,而这两个地址都指向了同一个对象,因此,改变其中任何一个变量,都会互相影响。
所以,引用类型的赋值其实是对象保存在栈区地址指针的赋值,所以两个变量指向同一个对象,任何的操作都会互相影响。
2.6.5引用类型的比较是引用的比较
let man = {
}
let woman = {
}
console.log(man === woman) // 输出:false
看上面的例子发现,两个对象一模一样,但是却不相等。因为引用类型的比较是引用的比较,换句话说,就是比较两个对象保存在栈区的指向堆内存的地址是否相等,此时,虽然man和woman看起来都是一个“{}”,但是他们保存在栈区中的指向堆内存的地址却是不同的,所以两个对象不相等。
2.6.6 引用类型是同时保存在栈区中和堆区中的,引用类型的存储需要在内存的栈区和堆区中共同完成,栈区保存变量标识符和指向堆内存的地址:
let a = {
name: 'aaa'}
let b = {
name: 'bbb'}
let c = {
name: 'ccc'}
上面三个对象的内存中保存情况如下图:
object.constructor 对象的constructor属性引用了该对象的构造函数
属性常用于判断未知对象的类型。给定了一个未知的值,就可以使用typeof运算符来判断它是原始的值还是对象。如果它是对象,就可以使用constructor属性来判断对象的类型。
function isArray(x) {
return ((typeof x == "object") && (x.co