数据类型的种类
js有7种数据类型
简单数据类型(基本数据类型): Undefined Null Boolean String Number Symbol (ES6新增)
复杂数据类型 (引用数据类型): Object (Object类型 Array类型 Data类型 Function类型 等)
Symbol 是 ES6引入了一种新的原始数据类型,表示独一无二的值。 最新的 ECMAScript 标准定义了 8 种数据类型: 原始类型 新增 BigInt
划分方式 : 是否可以表示为固定长度. 字符串是不可变的,因此被认为有固定长度
类型指的是值的类型,不是变量的类型(js是动态语言)
区别**
基本数据类型的值是按值访问的
- 基本类型的值是不可变得
- 基本类型的比较是值的比较
- 基本类型的变量是放在栈内存中(stack)
引用类型的值是按引用访问的
- 引用类型的值是可变的
- 引用类型的比较是引用的比较
- 引用类型的值是保存在堆内存(heap)中的对象。
判断数据类型
1.typeof
typeof 返回一个表示数据类型的字符串
typeof能判断一个数据是不是对象,却不能判断它是对象的哪个“子类型” 返回结果 number sting boolean undefined object function (需要注意返回结果是小写,需要带上引号)
其中可以对 number string boolean undefined 做出准确的判断
而对于引用类型,除function之外返回的都是 object .
注意:null 除外,typeof null === “object”.
typeof new Function() //function 有效 仅能判断的引用类型只有function
typeof [] //object 无效 上文中有说明array是引用类型
typeof null //object 无效 原因见下
typeof new Data() //object 无效
关于 typeof null //‘object’ 的原因
最初的js版本中,使用的是32位系统,为了性能考虑使用低位存储了变量的类型信息,000开头代表的是对象,然而null表示为全零,所以将它错误判断为 object 。
从逻辑角度来看,null值表示一个空对象指针。
2.instanceof
instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性
instanceof只能判断是否是你预期的类型且只能用于对象子类型的判断。
A instance B 如果A是B的实例,则返回true否则返回false instance 检测的是原型。
模拟instance 内部执行过程
instance(A,B){
var L = A.__proto__;
var R = B.__proto__;
if(L === R){
//A的内部属性__proto__ 指向B的原型对象
return true
}
return false
}
[] instanceof Array; //true
[] instanceof Object; //true
new Date() instanceof Date;//true
new Date() instanceof Object;//true
function Person(){};
new Person() instanceof Person;//true
new Person() instanceof Object;//true
[] Array Object 三者之间的关系
从instanceof 能够判断出 [].__proto__ 指向 Array.prototype,
而 Array.prototype.__proto__ 又指向了Object.prototype,
Object.prototype.__proto__ 指向了null,标志着原型链的结束。
注意:instanceof运算符只能用于对象,不适用原始类型的值。
'hello' instanceof String // false
null instanceof Object // false
undefined instanceof Object // false
字符串、null和undefined不是对象,所以返回false。
获取一个变量的正确类型
toString 是 Object 原型上的一个方法,该方法默认返回其调用者的具体类型,是toString 运行时this指向的对象类型,返回的类型格式是[object,xxx]
Object.prototype.toString.call(xx) // [ object Type]
var a = [1,2]
console.log(Object.prototype.toString.call(a)) //[object Array]
数值转换
Number() parseInt() parseFloat()
**
Number(true) //1
Number(undefined) //NaN
Number(15) //15
**
parseInt("") //NaN 空字符串
parseFloat(string) 解析参数(必要时先转换为字符串)并返回一个浮点数
使用场景
var year = '40 year';
console.log(parseFloat(year)) //40
我能添加一个字符串属性吗?
**
let str = "Hello";
str.test = 5; //(*)
console.log(str.test); // undefined
在执行 (*) 这一行
1.当访问str属性时,创建一个"包装对象"
2.当对属性进行操作的时候,这个对象获得了test属性
3.操作结束,"包装对象"消失
在最后一行,对字符串上的新的包装对象的每个对象操作,str 不再追踪这个属性。
这个例子清楚地表明,基本类型不是对象。
基本类型不能存储数据。
所有的属性/方法操作都是在临时对象的帮助下执行的。
操作符相关
递增与递减
一元加和减操作符
var a = "123"
a-0 //123
布尔操作符
逻辑非(!)
!"" //true
!" " //false
逻辑与(&&)
当操作数都为true时返回true;否则返回false.
var a = true
console.log(a&&1) //1
var a = false
console.log(a&&1) //false
逻辑或(||)
如果第一个操作数为true 就不会对第二个操作数求值
var a = true
console.log(a||1) //true
var a = false
console.log(a||1) //1
加法
var result = 5+"5" //"55"
相等操作符
== 与 ===
== 比较值相等
=== 比较值与类型
var num1 = "5"
var num2 = 5
console.log(num1 == num2) //true
console.log(num1 === num2) //false
注意: null==undefined //true
null === undefined // false
条件操作符
三元运算符 条件 ? 值1 : 值2
var status = (age >= 18) ? "adult" : "minor";
当 age 大于等于18的时候,将“adult”赋值给 status;否则将“minor”赋值给 status。
赋值操作符
var num = 10;
num = num + 10 //20
=> num += 10 //20
字符串
改变大小写
toLowerCase()
toUpperCase()
查找字符串
indexOf
str.indexOf(substr,pos)
pos 指定位置 substr寻找的字符 str字符串
var a = "hello"
console.log(a.indexOf("h")) //0
console.log(a.indexOf("h",1)) //-1
let str = "Widget with id";
if (str.indexOf("Widget") != -1) {
console.log("We found it"); // 现在运行了!
}
includes()
includes() 方法用于判断一个字符串是否包含在另一个字符串中,返回true 或 false
注意 区分大小写
let str = "Hello doraemon";
console.log(str.includes("hello")) //false
console.log(str.includes("do")) //true
获取子字符串
三种 substring
、substr
和 slice
str.slice(start [, end]) (重要)
返回从 start 到(但不包括)end 的字符串部分
let str = "doraemon";
console.log(str.slice(0,1)) //d
console.log(str.slice(0)) //doraemon
console.log(str.slice(-4,-1)) //emo
str.substring(start [, end])
返回 start 和 end 之间的字符串部分。
这与 slice 几乎相同,但它允许 start 大于 end。
let str = "doraemon";
console.log(str.substring(0,1)) //d
console.log(str.substring(0)) //doraemon
console.log(str.substring(-4,-1)) // 空
不支持 负参数 被视为 0
str.substr(start [, length])
从 start 开始返回给定 length 的字符串部分。
与以前的方法相比,这个允许我们指定 length 而不是结束位置:
let str = "doraemon";
console.log(str.substr(0,5)) //dorae
console.log(str.substr(0)) //doraemon
console.log(str.substr(-4,-1)) // 空
总结
字符串 https://zh.javascript.info/string
数组相关
创建数组的方法 2种
let arr = new Array()
let arr = [] //字面量 方式
多维数组操作
const 定义常量的时候
再重新赋值会报错,但是引用类型就不会(修改对象中的值也不会,因为此时const 定义的是一个引用类型的值)
例如 定义一个数组
const arr = [1,2]
arr[1] = 99
console.log(arr) //[1, 99]
Array of 与数组创建细节
控制台 空的是用 empty 代替 ,打印出来的结果是undefined
length 属性是数组中元素的总个数
let array = ["a","b","c"]
console.log(array)
array[3] = "d"
array[5] = "e" //["a", "b", "c", "d", empty, "e"]
console.log(array[4]) //undefined
仅只是 new Array() 这种创建方式 不常用
let cms = new Array(6) //empty
console.log(cms.length) //6
当只有一个值得时候 上述会创建6个空
新版解决方案
let arr = Array.of(6)
console.log(arr)
console.log(arr.length)
类型检测与转换
console.log(Array.isArray(1)) //false [] true
数组变成字符串 String(arr) arr.toString() arr.join(',')
1.let hd = [1,2,4].toString()
2.let hd = String([1,2,4])
3.let hd = [1,2,3].join(',')
console.log(typeof hd) //string
字符串变成数组
let str = 'chu'
console.log(str.split("")) //["c", "h", "u"]
console.log(Array.from(str))
语法是可以转的 需要length属性
let obj = {
0:"hchc",
1:"jfh",
length:2
}
console.log(Array.from(obj))
实际应用
<div>div1</div>
<div>div2</div>
let divs = document.querySelectorAll('div')
console.log(divs)
console.log(Array.from(divs,function(item){
// console.log(item.innerHTML)
item.style.backgroundColor = 'red'
}))
展开语法
for of 如何使用
let arr = ["aaa","bbb"]
let hd = ["12","23"]
for(let value of hd){
arr.push(value)
}
console.log(arr) //["aaa", "bbb", "12", "23"]
展开语法
let arr = ["aaa","bbb"]
let hd = ["12","23"]
arr = [...arr,...hd]
console.log(arr) //["aaa", "bbb", "12", "23"]
求和专题
应用场景 求和
遇到的问题 参数不固定 reduce
注意: array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
initialValue 可选
作为第一次调用 callback函数时的第一个参数的值 如果没有提供初始值,则将使用数组中的第一个元素
在没有初始值得空数组上调用reduce 将报错
function sum(...args){
console.log(args)
return args.reduce((s,v)=>{
return s+=v
},0)
}
console.log(sum(1,2,3,4))
对应链接 未进行整理
https://www.yuque.com/doraemon-g9kzm/hgcwlg/cbl140
数组的 pop/push shift/unshift 方法
作用于数组末端的方法
pop 取出并返回数组的最后一个元素
let array = ["a", "b", "c"]
array.pop() //"c"
array // ["a", "b"]
push
在数组末端添加元素
let array = ["a", "b", "c"]
array.push("d") //4
array //["a", "b", "c", "d"]
作用于数组前端的方法
shift
取出数组的第一个元素并返回它
let array = ["a", "b", "c"]
array.shift() // a
array //["b", "c"]
unshift
在数组的前端添加元素
let array = ["a", "b", "c"]
array.unshift("e") // 4
array //["e", "a", "b", "c"]
内部
数组是一种特殊的对象,使用方括号来访问属性 arr[0] 实际上是来自于对象的语法 这个数字被用作键值
let fruits = ["banana"]
let arr = fruits;
console.log(arr === fruits) //true
arr.push("pear")
性能方面
用作于数组的末端方法(pop/push )比前端快。
循环
for 循环
let arr = ["apple","orange","pear"]
for(let i=0;i<arr.length;i++){
console.log(arr[i])
}
for … of
let arr = ["apple","orange","pear"]
//迭代数组元素
for(let key of arr){
console.log(key)
}
for .. in (不适用于数组 速度很慢 )
let arr = ["apple","orange","pear"]
for(let key in arr){
console.log(arr[key])
}
关于 “length “
可以清空数组
let arr = ["apple","orange","pear"]
arr.length = 0
console.log(arr) //[]
多维数组
多维数组与一维数组的转换
toString
数组有自己的toString 方法的实现 会返回以逗号隔开的元素列表
let arr = ["apple","orange","pear"]
console.log(String(arr)) //apple,orange,pear
思考题
向数组上下文调用
let arr = ["a", "b"];
arr.push(function() {
alert( this );
})
arr[2](); // "a","b",function
arr[2] 函数也就是调用对象函数。自然地,它接收 this 引用的对象 arr 然后输出该数组
最大子数组
数组方法
未完待续
https://www.one-tab.com/page/kt7Vzfl2Ryej7OmW3uByDg
**
文章参考链接