数据类型的种类

js有7种数据类型
简单数据类型(基本数据类型): Undefined Null Boolean String Number Symbol (ES6新增)
复杂数据类型 (引用数据类型): Object (Object类型 Array类型 Data类型 Function类型 等)

Symbol 是 ES6引入了一种新的原始数据类型,表示独一无二的值。 最新的 ECMAScript 标准定义了 8 种数据类型: 原始类型 新增 BigInt

划分方式 : 是否可以表示为固定长度. 字符串是不可变的,因此被认为有固定长度
类型指的是值的类型,不是变量的类型(js是动态语言)

区别**
基本数据类型的值是按值访问的

  • 基本类型的值是不可变得
  • 基本类型的比较是值的比较
  • 基本类型的变量是放在栈内存中(stack)

引用类型的值是按引用访问的

  • 引用类型的值是可变的
  • 引用类型的比较是引用的比较
  • 引用类型的值是保存在堆内存(heap)中的对象。

image.png


判断数据类型

1.typeof
typeof 返回一个表示数据类型的字符串

typeof能判断一个数据是不是对象,却不能判断它是对象的哪个“子类型” 返回结果 number sting boolean undefined object function (需要注意返回结果是小写,需要带上引号)

其中可以对 number string boolean undefined 做出准确的判断
而对于引用类型,除function之外返回的都是 object .
注意:null 除外,typeof null === “object”.

  1. typeof new Function() //function 有效 仅能判断的引用类型只有function
  2. typeof [] //object 无效 上文中有说明array是引用类型
  3. typeof null //object 无效 原因见下
  4. 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 检测的是原型。

  1. 模拟instance 内部执行过程
  2. instance(A,B){
  3. var L = A.__proto__;
  4. var R = B.__proto__;
  5. if(L === R){
  6. //A的内部属性__proto__ 指向B的原型对象
  7. return true
  8. }
  9. return false
  10. }
  11. [] instanceof Array; //true
  12. [] instanceof Object; //true
  13. new Date() instanceof Date;//true
  14. new Date() instanceof Object;//true
  15. function Person(){};
  16. new Person() instanceof Person;//true
  17. new Person() instanceof Object;//true
  18. [] Array Object 三者之间的关系
  19. instanceof 能够判断出 [].__proto__ 指向 Array.prototype
  20. Array.prototype.__proto__ 又指向了Object.prototype
  21. Object.prototype.__proto__ 指向了null,标志着原型链的结束。

image.png

注意:instanceof运算符只能用于对象,不适用原始类型的值。

  1. 'hello' instanceof String // false
  2. null instanceof Object // false
  3. undefined instanceof Object // false
  4. 字符串、nullundefined不是对象,所以返回false


获取一个变量的正确类型
toString 是 Object 原型上的一个方法,该方法默认返回其调用者的具体类型,是toString 运行时this指向的对象类型,返回的类型格式是[object,xxx]

  1. Object.prototype.toString.call(xx) // [ object Type]
  2. var a = [1,2]
  3. console.log(Object.prototype.toString.call(a)) //[object Array]



数值转换
Number() parseInt() parseFloat()
**

  1. Number(true) //1
  2. Number(undefined) //NaN
  3. Number(15) //15

**

  1. parseInt("") //NaN 空字符串
  2. parseFloat(string) 解析参数(必要时先转换为字符串)并返回一个浮点数
  3. 使用场景
  4. var year = '40 year';
  5. console.log(parseFloat(year)) //40





我能添加一个字符串属性吗?
**

  1. let str = "Hello";
  2. str.test = 5; //(*)
  3. console.log(str.test); // undefined
  4. 在执行 (*) 这一行
  5. 1.当访问str属性时,创建一个"包装对象"
  6. 2.当对属性进行操作的时候,这个对象获得了test属性
  7. 3.操作结束,"包装对象"消失
  8. 在最后一行,对字符串上的新的包装对象的每个对象操作,str 不再追踪这个属性。
  9. 这个例子清楚地表明,基本类型不是对象。
  10. 基本类型不能存储数据。
  11. 所有的属性/方法操作都是在临时对象的帮助下执行的。

操作符相关

递增与递减
一元加和减操作符

  1. var a = "123"
  2. a-0 //123

布尔操作符

逻辑非(!)

  1. !"" //true
  2. !" " //false

逻辑与(&&)
当操作数都为true时返回true;否则返回false.

  1. var a = true
  2. console.log(a&&1) //1
  3. var a = false
  4. console.log(a&&1) //false

逻辑或(||)
如果第一个操作数为true 就不会对第二个操作数求值

  1. var a = true
  2. console.log(a||1) //true
  3. var a = false
  4. console.log(a||1) //1

加法

  1. var result = 5+"5" //"55"

相等操作符
== 与 ===
== 比较值相等
=== 比较值与类型

  1. var num1 = "5"
  2. var num2 = 5
  3. console.log(num1 == num2) //true
  4. console.log(num1 === num2) //false
  5. 注意: null==undefined //true
  6. null === undefined // false

条件操作符
三元运算符 条件 ? 值1 : 值2

  1. var status = (age >= 18) ? "adult" : "minor";
  2. age 大于等于18的时候,将“adult”赋值给 status;否则将“minor”赋值给 status

赋值操作符

  1. var num = 10;
  2. num = num + 10 //20
  3. => num += 10 //20

字符串

改变大小写
toLowerCase()
toUpperCase()

查找字符串
indexOf

  1. str.indexOf(substr,pos)
  2. pos 指定位置 substr寻找的字符 str字符串
  3. var a = "hello"
  4. console.log(a.indexOf("h")) //0
  5. console.log(a.indexOf("h",1)) //-1
  1. let str = "Widget with id";
  2. if (str.indexOf("Widget") != -1) {
  3. console.log("We found it"); // 现在运行了!
  4. }

includes()

  1. includes() 方法用于判断一个字符串是否包含在另一个字符串中,返回true false
  2. 注意 区分大小写
  3. let str = "Hello doraemon";
  4. console.log(str.includes("hello")) //false
  5. console.log(str.includes("do")) //true

获取子字符串
三种 substringsubstrslice

  1. str.slice(start [, end]) (重要)
  2. 返回从 start 到(但不包括)end 的字符串部分
  3. let str = "doraemon";
  4. console.log(str.slice(0,1)) //d
  5. console.log(str.slice(0)) //doraemon
  6. console.log(str.slice(-4,-1)) //emo
  1. str.substring(start [, end])
  2. 返回 start end 之间的字符串部分。
  3. 这与 slice 几乎相同,但它允许 start 大于 end
  4. let str = "doraemon";
  5. console.log(str.substring(0,1)) //d
  6. console.log(str.substring(0)) //doraemon
  7. console.log(str.substring(-4,-1)) // 空
  8. 不支持 负参数 被视为 0
  1. str.substr(start [, length])
  2. start 开始返回给定 length 的字符串部分。
  3. 与以前的方法相比,这个允许我们指定 length 而不是结束位置:
  4. let str = "doraemon";
  5. console.log(str.substr(0,5)) //dorae
  6. console.log(str.substr(0)) //doraemon
  7. console.log(str.substr(-4,-1)) // 空

总结

image.png

字符串 https://zh.javascript.info/string


数组相关

创建数组的方法 2种

  1. let arr = new Array()
  2. let arr = [] //字面量 方式

多维数组操作
const 定义常量的时候
再重新赋值会报错,但是引用类型就不会(修改对象中的值也不会,因为此时const 定义的是一个引用类型的值)
例如 定义一个数组

  1. const arr = [1,2]
  2. arr[1] = 99
  3. console.log(arr) //[1, 99]

Array of 与数组创建细节
控制台 空的是用 empty 代替 ,打印出来的结果是undefined
length 属性是数组中元素的总个数

  1. let array = ["a","b","c"]
  2. console.log(array)
  3. array[3] = "d"
  4. array[5] = "e" //["a", "b", "c", "d", empty, "e"]
  5. console.log(array[4]) //undefined
  1. 仅只是 new Array() 这种创建方式 不常用
  2. let cms = new Array(6) //empty
  3. console.log(cms.length) //6
  4. 当只有一个值得时候 上述会创建6个空
  5. 新版解决方案
  6. let arr = Array.of(6)
  7. console.log(arr)
  8. console.log(arr.length)

类型检测与转换

  1. console.log(Array.isArray(1)) //false [] true
  2. 数组变成字符串 String(arr) arr.toString() arr.join(',')
  3. 1.let hd = [1,2,4].toString()
  4. 2.let hd = String([1,2,4])
  5. 3.let hd = [1,2,3].join(',')
  6. console.log(typeof hd) //string
  7. 字符串变成数组
  8. let str = 'chu'
  9. console.log(str.split("")) //["c", "h", "u"]
  10. console.log(Array.from(str))
  11. 语法是可以转的 需要length属性
  12. let obj = {
  13. 0:"hchc",
  14. 1:"jfh",
  15. length:2
  16. }
  17. console.log(Array.from(obj))
  18. 实际应用
  19. <div>div1</div>
  20. <div>div2</div>
  21. let divs = document.querySelectorAll('div')
  22. console.log(divs)
  23. console.log(Array.from(divs,function(item){
  24. // console.log(item.innerHTML)
  25. item.style.backgroundColor = 'red'
  26. }))

展开语法

  1. for of 如何使用
  2. let arr = ["aaa","bbb"]
  3. let hd = ["12","23"]
  4. for(let value of hd){
  5. arr.push(value)
  6. }
  7. console.log(arr) //["aaa", "bbb", "12", "23"]
  8. 展开语法
  9. let arr = ["aaa","bbb"]
  10. let hd = ["12","23"]
  11. arr = [...arr,...hd]
  12. console.log(arr) //["aaa", "bbb", "12", "23"]
  13. 求和专题
  14. 应用场景 求和
  15. 遇到的问题 参数不固定 reduce
  16. 注意: array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
  17. initialValue 可选
  18. 作为第一次调用 callback函数时的第一个参数的值 如果没有提供初始值,则将使用数组中的第一个元素
  19. 在没有初始值得空数组上调用reduce 将报错
  20. function sum(...args){
  21. console.log(args)
  22. return args.reduce((s,v)=>{
  23. return s+=v
  24. },0)
  25. }
  26. console.log(sum(1,2,3,4))

对应链接 未进行整理
https://www.yuque.com/doraemon-g9kzm/hgcwlg/cbl140

数组的 pop/push shift/unshift 方法

作用于数组末端的方法

  1. pop 取出并返回数组的最后一个元素
  2. let array = ["a", "b", "c"]
  3. array.pop() //"c"
  4. array // ["a", "b"]
  5. push
  6. 在数组末端添加元素
  7. let array = ["a", "b", "c"]
  8. array.push("d") //4
  9. array //["a", "b", "c", "d"]

作用于数组前端的方法

  1. shift
  2. 取出数组的第一个元素并返回它
  3. let array = ["a", "b", "c"]
  4. array.shift() // a
  5. array //["b", "c"]
  6. unshift
  7. 在数组的前端添加元素
  8. let array = ["a", "b", "c"]
  9. array.unshift("e") // 4
  10. array //["e", "a", "b", "c"]

内部
数组是一种特殊的对象,使用方括号来访问属性 arr[0] 实际上是来自于对象的语法 这个数字被用作键值

  1. let fruits = ["banana"]
  2. let arr = fruits;
  3. console.log(arr === fruits) //true
  4. arr.push("pear")

性能方面

用作于数组的末端方法(pop/push )比前端快。

image.png

循环
for 循环

  1. let arr = ["apple","orange","pear"]
  2. for(let i=0;i<arr.length;i++){
  3. console.log(arr[i])
  4. }

for … of

  1. let arr = ["apple","orange","pear"]
  2. //迭代数组元素
  3. for(let key of arr){
  4. console.log(key)
  5. }

for .. in (不适用于数组 速度很慢 )

  1. let arr = ["apple","orange","pear"]
  2. for(let key in arr){
  3. console.log(arr[key])
  4. }

关于 “length “

可以清空数组

  1. let arr = ["apple","orange","pear"]
  2. arr.length = 0
  3. console.log(arr) //[]

多维数组
多维数组与一维数组的转换

toString
数组有自己的toString 方法的实现 会返回以逗号隔开的元素列表

  1. let arr = ["apple","orange","pear"]
  2. console.log(String(arr)) //apple,orange,pear

思考题
向数组上下文调用

  1. let arr = ["a", "b"];
  2. arr.push(function() {
  3. alert( this );
  4. })
  5. arr[2](); // "a","b",function
  6. arr[2] 函数也就是调用对象函数。自然地,它接收 this 引用的对象 arr 然后输出该数组

最大子数组

数组方法

未完待续

https://www.one-tab.com/page/kt7Vzfl2Ryej7OmW3uByDg

**

文章参考链接