数据类型(七)面向对象
构造函数:任何函数都可以当做构造函数,只要使用 new 关键字调用函数创建实例对象(箭头函数除外)
继承:
原型链继承: 缺点如果某个原型上的引用类型被其中一个实例改变了,那么其他实例也会受到影响。1234567891011function Parent(){ this.name = 'this is parent!' this.getName = function(){ return this.name; }}function Child(){ this.name = 'this is child!'}Child.prototype = new Parent()console.log(new Child().getName())
构造函数继承:通过使用 call 或 apply 方法,实现在子类中执行父类型的构造函数
优点:原型属性不会被共享
缺陷:不会继承父类 prototype 上属性12345678function Parent(){ this.say ...
数据类型(六)深拷贝和浅拷贝
浅拷贝
主要针对对象的属性对应的值也是复杂类型的情况,此时浅拷贝的对象在对属性值为复杂类型的属性进行修改时,也会影响到原始对象,即被拷贝的对象。
对象的浅拷贝
Object.assign()
展开运算符
for…in… + Object.hasOwnProperty()
Object.keys()
数组的浅拷贝
Array.slice(start, end) — 左闭右开
Array.concat() —使用空数组拼接
深拷贝
JSON.parse(JSON.stringify())
无法拷贝函数、特殊对象:Date、Regex
不会拷贝原型链上的属性
会忽略Symbol和undefined属性值对应的属性
手写深拷贝函数1234567891011121314151617181920212223242526272829function deepClone(source: Object, cloneMap = new Map()) { if (!(source instanceof Object) || source === null) { ret ...
数据类型(四)null、undefined、NaN
null 和 undefined 的区别
null 表示“无”的对象,转数字为 0
作为函数参数,表示该函数的参数不是对象
作为对象原型链的终点
undefined 表示“无”的原始值,转数字为 NaN
表示缺少值,应该有值但是没定义
变量被声明但未赋值
函数没有返回值
对象没有复制的属性
typeof null结果时Object
null是一种基本类型,在JavaScript设计之初是在32为系统,判断数据类型的时候是通过机器码进行的,每一种类型都有对应的机器码。
对象机器码为000,null机器码全为0,typeof在比较类型的时候只会比较后三位,两者相同,所以js认为两者相同。
如何安全获取 undefined 值
void 0。
isNaN 和 Number.isNaN
isNaN
会尝试讲参数进行类型转换,如果不能被转化为Number类型则会返回true。非数字值传入也会返回true
Number.isNaN
不会进行数据类型转换
数据类型(四)类型转换与隐式类型转换
显示类型转换面试题123456console.log(["1", "2", "3"].map(parseInt))// [1, NaN, NaN]/*"1"=> parseInt("1", 0)"2"=> parseInt("2", 1)"3"=> parseInt("3", 2)*/
map((item, index, arr)):当前值,下标,整个数组
parseInt(string, radix):当前字符串,进制
123456console.log(parseInt(1/0, 19))// 18/*1/0 = Infinity等价于parseInt("Infinity", 19)19进制有I,但是没有n,则直接返回i,即18*/
123456console.log(parseInt(parseInt, 16))// 15/*String(parseInt)=& ...
数据类型(三)判断数组的方式
Object.prototype.toString.call()
Object.prototype.toString.call(),返回值是一个[object [[class]]]
每一个对象都有一个内部属性[[class]],用于表示其类型,不可直接访问
数组:Array
方法:Function
数字:Number
字符串:String
兑现:Object
通过原型链判断1console.log([].__proto__ === Array.prototype)
Array.isArray()instanceof1console.log([] instanceof Array)
数据类型(二)包装类型
123456const a = 18;console.log(a.toString())// "18"//===等价于===(js引擎做的事)const a = 18;const tmpAObject = new Number(a);console.log(tmpAObject.toString())// "18"
包装类型与引用类型的不同
包装类型只会在执行瞬间被创建,调用后被销毁。
1234567const person = { name: "zhangsan", age: 18}console.log(person.age)// 18//======
数据类型(一)基本类型与应用类型
1234567891011function modifyNumber(a: number): void{ a = 18;}function modifyArray(arr: number[]): void{ arr.push(18)}let a = 1, b = [1];modifyNumber(a);modifyArray(b);console.log(a);// 1console.log(b);// [1, 18]
JavaScript 类型
原始类型/基本类型:
值存储在栈中,进行赋值操作时,会开辟新的空间存储,互不影响。
Number、String、Boolean、Null、Undefined、Symbol、Bigint
引用类型
值存储在堆中,栈中存储的是对象堆内存的地址,进行赋值操作时,只要修改其中一个变量引用的对象,其它引用该变量也会受到影响
Array、Object、Function、Set、Map、Date、RegExp
Symbol
基本用法:123456789let id1 = Symbol('id ...
1921. 消灭怪物的最大数量
题目点击前往
你正在玩一款电子游戏,在游戏中你需要保护城市免受怪物侵袭。给你一个下标从 0 开始且长度为 n 的整数数组 dist,其中 dist[i] 是第 i 个怪物与城市的初始距离(单位:米)。
怪物以恒定的速度走向城市。给你一个长度为 n 的整数数组 speed 表示每个怪物的速度,其中 speed[i] 是第 i 个怪物的速度(单位:米/分)。
怪物从 第 0 分钟时开始移动。你有一把武器,并可以选择在每一分钟的开始时使用,包括第 0 分钟。但是你无法在一分钟的中间使用武器。这种武器威力惊人,一次可以消灭任一还活着的怪物。
一旦任一怪物到达城市,你就输掉了这场游戏。如果某个怪物恰在某一分钟开始时到达城市,这会被视为输掉游戏,在你可以使用武器之前,游戏就会结束。
返回在你输掉游戏前可以消灭的怪物的最大数量。如果你可以在所有怪物到达城市前将它们全部消灭,返回 n 。
示例 1:
12345678输入:dist = [1,3,4], speed = [1,1,1]输出:3解释:第 0 分钟开始时,怪物的距离是 [1,3,4],你消灭了第一个怪物。第 1 分钟开始时,怪物的距离是 [ ...
2511. 最多可以摧毁的敌人城堡数目
题目点击前往
给你一个长度为 n ,下标从 0 开始的整数数组 forts ,表示一些城堡。forts[i] 可以是 -1 ,0 或者 1 ,其中:
-1 表示第 i 个位置 没有 城堡。0 表示第 i 个位置有一个 敌人 的城堡。1 表示第 i 个位置有一个你控制的城堡。
现在,你需要决定,将你的军队从某个你控制的城堡位置 i 移动到一个空的位置 j ,满足:0 <= i, j <= n - 1军队经过的位置 只有 敌人的城堡。正式的,对于所有 min(i,j) < k < max(i,j) 的 k ,都满足 forts[k] == 0 。当军队移动时,所有途中经过的敌人城堡都会被 摧毁 。
请你返回 最多 可以摧毁的敌人城堡数目。如果无法移动你的军队,或者没有你控制的城堡,请返回 0 。
示例 1:
123456输入:forts = [1,0,0,-1,0,0,0,0,1]输出:4解释:- 将军队从位置 0 移动到位置 3 ,摧毁 2 个敌人城堡,位置分别在 1 和 2 。- 将军队从位置 8 移动到位置 3 ,摧毁 4 个敌人城堡。4 是最多可以摧毁的敌人 ...
TypeScript学习笔记(十三)泛型
泛型
泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
单看定义可能不是那么容易理解,不妨我们从一个例子出发来探寻泛型。
需求:编写一个恒等函数(返回任何传进内容的函数)。那么如果使用 js 来编写,很简单就写出来了。
123function identity(arg){ return arg}
现在我们利用 TS 来编写,这时针对该函数我们的变量类型该怎么写呢?由于输入值的类型是不确定的,我们没有办法很直接的将具体类型直接声明出来。这时可能就会想使用any类型。如果使用any类型,也让我们丢失了函数返回时的类型信息。
所以我们需要一种可以捕获参数类型的方式,然后再用它表示返回值的类型。这里我们用了一个类型变量(type variable),一种用在类型而非值上的特殊的变量。
123function identity<T>(arg: T): T{ return arg;}
此时,当我们传入不同类型的值后,通过该函数的返回的值的类型也是明确的。
多个类型参数12 ...