データの種類
a. 参照型/値型とは?
1. 値型のキーと値をスタックに格納する(少量)
2. 参照型の応用型はデータを展開してスタックに格納する(大量)
3. 参照型を変数に代入するのが参照変数のアドレスは参照型ヒープ内のアドレスを指す
b. 値の型は何ですか?
文字列文字、数字、ブール値、ブール値、未定義未定義、ヌル空、シンボル記号
c. 参照タイプとは?
オブジェクトオブジェクト、配列番号、関数関数、マップ図、セットコレクション
d. データ型の判断方法は?
- タイプのタイプ
typeof “abc” ----------- string
typeof 123 ----------- number
typeof true ----------- boolean
typeof undefined ----------- undefined
typeof null ----------- object(null空指针)
typeof {
} ----------- object
typeof [] ----------- object
typeof function() ----------- function
//引用类型出函数外 返回的是object
//适合判断值类型与引用类型,不能判断具体引用类型
- インスタンスのインスタンス
[] instanceof Array ----------- true
[] instanceof Object ----------- true
{
} instanceof Array ----------- false
{
} instanceof Object ----------- true
//判断是否是其原型链上的实例,只要构造函数在原型链上都返回true
//[]由Array创建的,Array是Object的子类,instanceof Array和Object都返回true
- コンストラクタ コンストラクタ
//判断实例对象构造函数
[] constantor === Array true
- Array.isArray() が配列かどうか
- Object.prototype.toString.call(obj)原型
- 最も正確な判断
Object,prototype.toString.call(obj).slice(8,-1)
//返回最精准的数据类型
シャローコピーとディープコピー
浅いコピーの方法をいくつか挙げていただけますか?
- 展開 {...obj}
- トラバーサル用 (浅いコピー (属性値が参照型の場合、両方の変数の属性が同じメモリ アドレスを指す))
- Object.assign() (パラメーターの 2 つのオブジェクトをマージすると、同じ属性が前面を上書きします)
// js拷贝对象
// 浅拷贝,只能拷贝值类型,引用类型数据还是指向地址
var obj1 = {
name:"mumu",
age:18,
friend:["小红","小蓝",{
name:"小绿",
job:"teacher"
}]
}
// ES6扩展
var obj2 = {
...obj1}
// 循环
var obj3 = {
}
for(var k in obj1){
obj3[k] = obj1[k];
}
// Object.assign把参数的两个对象进行合并,属性相同后面覆盖前面
var obj4 = Object.assign(obj1,{
});
b. ディープコピーについて何を知っていますか?
ディープ コピー、ターゲット オブジェクトとソース オブジェクトが切り離されている
- JSON.parse(JSON.stringify(data)):
json データ型は一意、文字列、数値、null、未定義、配列のみをサポートし、オブジェクトは関数やその他のデータ型を無視します - 型判定による再帰的なディープコピー(再帰とは、関数が自分自身を呼び出すことを意味し、終了条件が必要です)
// js拷贝对象
// 深拷贝,目标对象与元对象相互之间切断联系
var obj1 = {
name:"mumu",
age:18,
friend:["小红","小蓝",{
name:"小绿",
job:"teacher",
say(){
alert("你好,我是"+this.name)
}
}]
}
// JSON转字符串,字符串转对象
var obj2 = JSON.parse(JSON.stringify(obj1))
// json字符串的值指挥保留数组、对象、字符串、数字、null、undefined
// 对象中的函数会被过滤掉(一般数据也是不带函数的)
//通过递归自己调用自己
var obj1 = {
name:"mumu",
age:18,
friend:["小红","小蓝",{
name:"小绿",
job:"teacher",
say(){
alert("你好,我是"+this.name)
}
}]
}
function deepCopy(obj){
if(typeof obj == "object" && obj!= null){
var temp = null;
if(obj instanceof Array){
temp = [];
for(var i=0;i<obj.length;i++){
temp[i] = deepCopy(obj[i])
}
}else{
temp = {
};
for(var k in obj){
temp[k] = deepCopy(obj[k]);
}
}
return temp;
}else{
return obj;
}
}
var obj2 = deepCopy(obj1);
暗黙の変換
ヒント: データ型の変換は、必須の変換、暗黙の変換に分けられます。
a. 強調変換とは何ですか? :
- Number() は数値に変換します
- String() から String Boolean()
から Boolean
b. 暗黙の変換記号とは? :
- + 文字列連結記号は、他の型を文字列に変換しようとします。
- ± * / == は他の型を数値に変換しようとします;
変換失敗 NaN; - false は 0 に変換され、true は 1 に変換されます。
- <,>,>= ,<=, ! !,= == 判定とロジックリターンは、他のタイプのブール値を変換しようとします (誤って変数を false に、空の文字列、null、NaN、未定義、0、を false に変換します) )
c. 意味と厳密に等しく、相対的に等しいか?
-
= = =
型と値が相対的かどうかの判断は、
いつでも使用する必要があります = = = (null か undefined かを判断する場合は特殊な場合があります)
null === null true -
==
暗黙変換後の値「100」を判定する
== 100 // true
null == 未定義 //true
0 == false //true -
特殊なケース: NaN === null // false
{} == {} // false
[] == {} //false
は別のメモリ アドレスを指す
if判定は何をしますか?
-
if() の判定が本当に変数かどうか
-
Falsely 変数: false 空文字列 0 NaN undefined null (2 回否定 !!a して結果を取得すると false)
-
偽りの変数に加えて、他のすべては真の変数です
論理的かつ論理的または区別を実行しますか?
1.A||B
A は true (true) 結果は A、それ以外の場合は B
2.A&B
A は false (falsely) 結果は A、それ以外の場合は B
3. 判定対象
if(a&&a.b&&a.bc){}
if(a?.b?.c){}
aがあってabがあってabcがある場合
if(abc){} これは間違い
プロトタイプとプロトタイプ チェーン
a. プロトタイプとは何ですか? プロトタイプ チェーンとは何ですか?
- プロトタイプの表示: クラス/コンストラクターは、本質的にオブジェクトである明示的なプロトタイプ ptotype です。
- 暗黙のプロトタイプ: すべてのインスタンスには暗黙のプロトタイプ __proto__ があります
- 明示的および暗黙的な関係: クラスは、プロトタイプ プロトタイプが、それが作成するインスタンスの暗黙的なプロトタイプと等しいことを示します __proro__
b. プロトタイプチェーンとは? (アイコンを描くことができます)
- オブジェクトインスタンスのメソッドやプロパティを探すときは、まず自分で探し、見つからない場合は__proro__に沿って調べ、__proro__によって形成される連鎖関係をプロトタイプチェーンと呼びます
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>原型</title>
</head>
<body>
<script>
// 01 创建People类
function People(name,age){
this.name = name;
this.age = age;
}
// 02 给pepole显示原型添加 eat方法
People.prototype.eat = function(){
console.log(this.name+"正在吃饭")
}
// 03 创建学生类继承 People类
function Student(name,age,no){
// 执行People构造按函数(执行people函数并把当前的this传入函数,当前peoplethis)
People.call(this,name,age);
// 定义学号
this.no =no;
}
// 04 让Student原型链继承People的原型链
Student.prototype = Object.create(People.prototype);
// 05 修正 Student 显示原型上的构造函数
Student.prototype.constructor = Student;
// 06 在Student显示原型链添加方法
Student.prototype.study = function(){
console.log(this.name+"正在好好学习,dayday up");
}
// 07 构建Student的实例 s1
var s1 = new Student("小曾",18,9527);
</script>
</body>
</html>
c. プロトタイプとプロトタイプ チェーンの役割は?
- jsの継承を実現
1.1 クラスの extends メソッド
//- class 的 extends方法
class Student extends People{
constructor(name,age,no){
//类中继承构造函数
super(name,age)}
}
1.2 プロトタイプチェーンの使用
1. Stuent构造函数中继承
function Student(name,age,no){
People.call(this,name,age) .... }
2.继承原型链
Student.prototype = Object.create(People.prototype)
2. 修正Student构造函数
Stuent.prototype.constructor = Student
- クラスを実装するためのインスタンス メソッド拡張
- Array.prototype.max = function(){return Math.max(…this))}
すべての配列には max メソッドがあります - String.prototype.reverse = function(){ return this.split("").reverse().join("")}
すべての文字列は逆メソッドを持ちます
知らせ: 通常、デフォルト オブジェクトのメソッドは変更しないでください。拡張する場合は注意してください。