Базовые знания о интерфейсе (пересмотрите старое и изучите новое)

JavaScript

Первый: рассказ об истории фронтенд-разработки Первый этап: C/S (клиент-сервер) -> B/S (браузер-сервер) создание веб-страницы Стек технологий: PhotoShop, HTML, CSS

Второй этап: от статики к динамике, от бэкенда к фронтенду Front-end разработчик Переднее и заднее разделение Предыстория: Полный анализ данных и написание бизнес-логики (включая написание интерфейса API) Внешний интерфейс: создание веб-страницы, эффекты взаимодействия с JS, взаимодействие с данными и привязка

Стек технологий: JavaScript, AJAX (междоменные трюки), jQuery...

Третий этап: от фронтенда к фулленду (от ПК к мобильному) Стек технологий: H5, CSS3, разработка адаптивного макета, Zepto, Hybrid (разработка гибридных приложений), апплет WeChat...

Этап 4: От полного к полному стеку Полная разработка: можно разрабатывать как интерфейсную, так и внутреннюю часть (строго говоря, один язык завершает разработку интерфейса и серверной части) Стек технологий: NODE (разработка серверных программ на языке программирования JS), Express/Koa...

Чтобы удовлетворить постоянно растущий фронтенд-разработку, в JS существует множество фреймворков, помогающих разрабатывать, поддерживать и повышать производительность: Vue, React, Angular, webpack...

В предвкушении эры WEB4.0, первого года VR/AR интерфейсу нужен Canvas/webGL...


2. О ядре и движке браузера webkit (движок v8): большинство браузеров геккон: Firefox трезубец: IE ...

W3C: Way Web Alliance, сформулируйте спецификации и стандарты для языков программирования Разработчики записи кода в соответствии с спецификацией, разработчик браузера также разработает набор вещей, которые следуют спецификации для отображения кода в качестве страницы (эта вещь - ядро ​​или двигатель)

Роль ядра браузера: в соответствии с определенными спецификациями, код на основе GPU (графика) и нарисовать шаблон соответствующей страницы и т. Д.

Почему появляется совместимость браузера: 1. Некоторые браузеры заранее разработают некоторые лучшие функции, и эти функции будут включены в спецификацию W3C позже, но перед включением будет определенная совместимость 2. Различные производители браузеров, чтобы подчеркнуть свою уникальность, используют другие методы для реализации функций в спецификации W3C. ...


3. JavaScript JS: легкий клиентский скриптовый язык программирования

  1. Язык программирования HTML+CSS — это язык разметки. Языки программирования обладают определенной логикой и имеют собственные идеи программирования (объектно-ориентированное программирование [ООП], процедурное программирование)
  • объектно-ориентированный
    • C++
    • JAVA
    • PHP
    • С# (.net)
    • JS
    • ...
  • ориентированный на процесс
    • C
  1. Текущий JS — это не только клиентский язык, его можно использовать как серверную программу на основе NODE, поэтому JS — это язык программирования с полным стеком.

  2. Изучая JS, изучаем его составляющие

  • ECMAScript (ES): основной синтаксис JS.
  • DOM: объектная модель документа Объектная модель документа предоставляет различные API (атрибуты и методы), чтобы JS мог получать или манипулировать HTML-элементами (DOM и элементами) на странице.
  • BOM: объектная модель браузера. Объектная модель браузера, предоставляющая различные API, чтобы JS мог управлять браузером.

Четыре: ESMAScript Это планирование синтаксиса JS.Переменные, типы данных, спецификации синтаксиса, операторы операций, шаблоны проектирования и т. д. в JS определяются ES.


Пять: переменная (переменная) Это не конкретное значение, а контейнер или местоимение, используемое для хранения определенных значений, поскольку хранимое в нем значение может быть изменено, поэтому оно называется переменной.

Основываясь на спецификации синтаксиса ES, существуют следующие способы создания переменных в JS.

  • var (ES3)
  • function (ES3) Создать функцию (имя функции также является переменной, но сохраненное значение имеет тип функции)
  • let (ES6)
  • const (ES6) создает константы
  • import (ES6) экспортирует необходимую информацию на основе спецификации модуля ES6.
  • class (ES6) Создание классов на основе ES6
/*
 * 语法:
 *   var [变量名]=值
 *   let [变量名]=值
 *   const [变量名]=值
 *   function 函数名(){
 *
 *   }
 *   ...
 */
var n = 13;
n = 15;
alert(n+10);//=>弹出来25 此时的N代表15

const m = 100;
m = 200;//=>Uncaught TypeError: Assignment to constant variable. 不能给一个常量重新的赋值(常量存储的值不能被修改,能够修改就是变量了)

Создавайте переменные и следуйте некоторым соглашениям при их именах.

  • Строго с учетом регистра
  • Соблюдайте номенклатуру верблюжьего регистра: имя в соответствии с цифрами, буквами, символами подчеркивания или $ (цифры не могут использоваться в качестве начала имени), и при наименовании объединяются в полное имя на основе английских слов (первое слово в нижнем регистре, а остальные имеют смысл Первая буква слова заглавная)
  • Нельзя использовать ключевые слова и зарезервированные слова: те, которые имеют особое значение в JS, называются ключевыми словами, а те, которые могут стать ключевыми словами в будущем, называются зарезервированными словами.
var n=12;
var N=13; //=>两个n不是同一个变量

var studentInfo / student_info / _studentInfo(下划线在前的,都是公共变量) / $studentInfo(一般存储的是JQ元素)...

语义化强一些
  add / create / insert
  del(delete)/ update / remove(rm)
  info / detail
  log
  ...

Шесть: значение данных - это материал, созданный языком программирования.Значения, содержащиеся в JS, имеют следующие типы

  • Базовые типы данных (типы значений)
    • номер номер
    • строка строка
    • логическое логическое значение
    • null
    • undefined
  • ссылочный тип данных
    • Объект Object
      • нормальный объект
      • объект массива
      • обычный объект
      • объект даты
      • ...
    • функция функция
  • В ES6 добавлен специальный тип: символ, уникальное значение.
[基本数据类型]
var n = 13; //=>0 -13 13.2 数字类型中有一个特殊的值NaN(not a number代表不是一个有效的数字,但是属于number类型的)

var s = '';//=>"" '13' "{}" JS中所有用单引号或者双引号包裹起来的都是字符串,里面的内容是当前字符串中的字符(一个字符串由零到多个字符组成)

var b = true;//=>布尔类型只有两个值 true真 false假

[引用数据类型]
var o = {name:'南飞雁培训',age:9};//=>普通的对象:由大括号包裹起来,里面包含多组属性名和属性值(包含多组键值对) {}空对象

var ary = [12,23,34,45]; //=>中括号包裹起来,包含零到多项内容,这种是数组对象  []空数组

var reg = /-?(\d|([1-9]\d+))(\.\d+)?/g; //=>由元字符组成一个完整的正则  //不是空正则是单行注释

function fn(){

}

[Symbol]
创建出来的是一个唯一的值
var a = Symbol('南飞雁');
var b = Symbol('南飞雁');
a==b =>false

Расширение: как запускается код JS и как выводить результаты после запуска [как бежать]

  • Запустите код в браузере (ядро браузера выполняет синтаксический анализ)
  • Запуск на основе NODE (NODE также является инструментом для рендеринга и парсинга JS на основе движка V8)

[Как вывести результат]

  • оповещение: вывод в браузере с помощью всплывающего окна (окно подсказки браузера)
var num=12;
alert(num); //=>window.alert

var str='南飞雁';
alert(str);

基于alert输出的结果都会转换为字符串:把值(如果是表达式先计算出结果)通过toString这个方法转换为字符串,然后再输出
alert(1+1); =>'2'
alert(true); =>'true'
alert([12,23]); =>'12,23'
alert({name:'xxx'}); =>'[object Object]' 对象toString后的结果就是object object,为啥?
  • подтвердить: это то же самое, что и использование оповещения, за исключением того, что в окне подсказки есть две кнопки для подтверждения и отмены, поэтому это окно подсказки подтверждения.
var flag = confirm('确定要退出吗?');
if(flag){
   //=>flag:true 用户点击的是确定按钮
}else{
   //=>flag:false 用户点击的是取消按钮
}
  • подсказка: добавить поле ввода на основе подтверждения

  • console.log: вывод журналов в консоль браузера (нажмите F12 (FN+F12), чтобы открыть консоль браузера).

    • Элементы: здесь можно увидеть элементы и стили на текущей странице, а стиль также можно настроить для изменения структуры и т. д.
    • Консоль: консоль, которую можно вывести сюда через .log в коде JS, или можно напрямую написать код JS сюда
    • Источники: все исходные файлы текущего веб-сайта находятся здесь.
    • ...
  • console.dir: более подробный, чем вывод журнала (особенно при выводе значений данных объекта)

  • console.table: вывод данных JSON в виде таблицы

  • ... (Вернитесь назад и раскройте дополнительные методы вывода консоли самостоятельно)


7. Детальный анализ типов данных

  1. числовой тип NaN: не число, а число isNaN: проверяет, является ли текущее значение недопустимым числом, возвращает true, если оно не является допустимым числом, и возвращает false, если оно является допустимым числом.
//=>语法:isNaN([value])
var num=12;
isNaN(num); //->检测num变量存储的值是否为非有效数字 false

isNaN('13') =>false
isNaN('南飞雁') =>true
isNaN(true) =>false
isNaN(false) =>false
isNaN(null) =>false
isNaN(undefined) =>true
isNaN({age:9}) =>true
isNaN([12,23]) =>true
isNaN([12]) =>false
isNaN(/^$/) =>true
isNaN(function(){}) =>true

重要:isNaN检测的机制
1、首先验证当前要检测的值是否为数字类型的,如果不是,浏览器会默认的把值转换为数字类型

  把非数字类型的值转换为数字
  - 其它基本类型转换为数字:直接使用Number这个方法转换的

  [字符串转数字]
    Number('13') ->13
    Number('13px') ->NaN 如果当前字符串中出现任意一个非有效数字字符,结果则为NaN
    Number('13.5') ->13.5 可以识别小数

  [布尔转数字]
    Number(true) ->1
    Number(false) ->0

  [其它]
    Number(null) ->0
    Number(undefined) ->NaN

  - 把引用数据类型值转换为数字:先把引用值调取toString转换为字符串,然后再把字符串调取Number转换为数字

   [对象]
     ({}).toString() ->'[object Object]' ->NaN

   [数组]
     [12,23].toString() ->'12,23' ->NaN
     [12].toString() ->'12' ->12

   [正则]
     /^$/.toString() ->'/^$/' ->NaN

  Number('') ->0
  [].toString() ->''
  => isNaN([]):false

2、当前检测的值已经是数字类型,是有效数字返回false,不是返回true(数字类型中只有NaN不是有效数字,其余都是有效数字)

  1. parseInt / parseFloat

Эквивалент числа, но и для преобразования других типов значений в числовые типы.

Отличие от Number заключается в анализе преобразования строк.

Число: встречается любой незначащий числовой символ, результатом является NaN.

parseInt: анализирует целую часть строки, parseFloat анализирует десятичную (с плавающей запятой) часть строки.

parseInt('13.5px') =>13
parseFloat('13.5px') =>13.5

parseInt('width:13.5px') =>NaN 从字符串最左边字符开始查找有效数字字符,并且转换为数字,但是一但遇到一个非有效数字字符,查找结束
  1. Сравнение NaN
NaN==NaN:false NaN和谁都不相等,包括自己

Вопрос для размышления: есть переменная num, и сохраненное значение неизвестно. Я хочу определить, является ли это допустимым числом. Возможна ли следующая схема?

if(Number(num)==NaN){
    alert('num不是有效数字!');
}

NaN和谁都不相等,条件永远不成立(即使num确实不是有效数字,转换的结果确实是NaN,但是NaN!=NaN的)

if(isNaN(num)){
    //=>检测是否为有效数字,只有这一种方案
    alert('num不是有效数字!')
}

логический тип

Всего два значения: true/false

Как преобразовать другие типы данных в логический тип?

  • Boolean
  • !
  • !!
Boolean(1) =>true

!'南飞雁培训' =>先把其它数据类型转换为布尔类型,然后取反

!!null =>去两次反,等价于没取反,也就剩下转换为布尔类型了

закон:在JS中只有“0/NaN/空字符串/null/undefined”这五个值转换为布尔类型的false,其余都转换为true


null && undefined

Оба представляют собой пустой или никакой

  • null: нулевой указатель объекта
  • неопределенный: неопределенный

Null, как правило, не ожидается (популярное понимание: обычно сначала вручную присваивается значение null, и мы снова назначим его в следующей программе)

var num = null; //=>null是手动赋值,预示着后面我会把num变量的值进行修改
...
num = 12;

То, что представляет undefined, обычно не контролируется людьми вручную, и большинство из них пусты браузером (что может быть назначено или не назначено позже).

var num; //=>此时变量的值浏览器给分配的就是undefined
...
后面可以赋值也可以不赋值

Подруга Лю Тяньжуя (BOY) пуста, а его бойфренд не определен


объект объектный тип данных

нормальный объект

  • в фигурных скобках
  • Состоит из нуля или более наборов имен атрибутов и значений атрибутов (пар ключ-значение)

属性是用来描述当前对象特征的,属性名是当前具备这个特征,属性值是对这个特征的描述(专业语法,属性名称为键[key],属性值称为值[value],一组属性名和属性值称为一组键值对)

var obj = {
	name:'南飞雁培训',
	age:9
};
//=>对象的操作:对键值对的增删改查
语法:对象.属性 / 对象[属性]

[获取]
obj.name 
obj['name']  一般来说,对象的属性名都是字符串格式的(属性值不固定,任何格式都可以)

[增/改]
JS对象中属性名是不允许重复的,是唯一的
obj.name='周啸天'; //=>原有对象中存在NAME属性,此处属于修改属性值
obj.sex='男'; //=>原有对象中不存在SEX,此处相当于给当前对象新增加一个属性SEX
obj['age']=28;

[删]
彻底删除:对象中不存在这个属性了
delete obj['age'];

假删除:并没有移除这个属性,只是让当前属性的值为空
obj.sex=null;

----
在获取属性值的时候,如果当前对象有这个属性名,则可以正常获取到值(哪怕是null),但是如果没有这个属性名,则获取的结果是undefined
obj['friends'] =>undefined

Вопросы для размышления:

var obj = {
	name:'南飞雁培训',
	age:9
};
var name = 'zhufeng';

obj.name  =>'南飞雁培训'  获取的是NAME属性的值
obj['name'] =>'南飞雁培训' 获取的是NAME属性的值
obj[name] =>此处的NAME是一个变量,我们要获取的属性名不叫做NAME,是NAME存储的值'zhufeng' =>obj['zhufeng'] =>没有这个属性,属性值是undefined

----
'name' 和 name 的区别?
  => 'name'是一个字符串值,它代表的是本身
  => name是一个变量,它代表的是本身存储的这个值

Имена свойств в объекте не только в строковом формате, но также могут быть в числовом формате.

var obj = {
	name:'南飞雁培训',
	0:100
};
obj[0] =>100
obj['0'] =>100
obj.0 =>Uncaught SyntaxError: Unexpected number

----
当我们存储的属性名不是字符串也不是数字的时候,浏览器会把这个值转换为字符串(toString),然后再进行存储

obj[{}]=300;  =>先把({}).toString()后的结果作为对象的属性名存储进来 obj['[object Object]']=300

obj[{}] =>获取的时候也是先把对象转换为字符串'[object Object]',然后获取之前存储的300

----
数组对象(对象由键值对组成的)
var oo = {
	a:12
};
var ary = [12,23]; //=>12和23都是属性值,属性名呢?

通过观察结果,我们发现数组对象的属性名是数字(我们把数字属性名称为当前对象的索引)
ary[0]
ary['0']
ary.0  =>报错

Оператор операции суждения в JS

1. если/иначе если/иначе

var num = -6;
if(num>10){
	num++; //=>num=num+1 num+=1 在自身的基础上累加1
}else if(num>=0 && num<=10){
	num--;
}else{
	num+=2;
}
console.log(num);

Пока одно условие выполнено, независимо от того, будут ли другие условия удовлетворены позже, оно не считается выполненным.

var num = 10;
if(num>5){
	num+=2;
}else if(num>8){
	num+=3;
}else{
	num+=4;
}
console.log(num); //=>12

Как я могу написать об условиях?

// >= / <= / == 常规比较
if(0){
	//=>不管你在条件判断中写什么,最后总要把其计算出TRUE/FALSE来判断条件是否成立(把其它类型的值转换为布尔类型,只有 0/NaN/''/null/undefined 是false,其余都是true)
}

if('3px'+3){
	//=>在JS中,+ - * / % 都是数学运算,除 + 以外,其余运算符在运算的时候,如果遇到了非数字类型的值,首先会转换为数字类型(Number),然后再进行运算
	
	//=>+ 在JS中除了数学相加,还有字符串拼接的作用(如果运算中遇到了字符串,则为字符串拼接,而不是数学相加)

	'3px'+3 =>'3px3'
}
if('3px'-3){
	'3px'-3 =>NaN
}

Вопросы для интервью с БАТ:

var num = parseInt('width:35.5px');
if(num==35.5){
	alert(0);
}else if(num==35){
	alert(1);
}else if(num==NaN){
	alert(2);
}else if(typeof num=='number'){
    //=>先算typeof num
    //=>在做比较
	alert(3);//=>alert输出的都是字符串格式的 '3'
}else{
    alert(4);
}

typeof

Одним из способов определения типов данных в JS, помимо него, являются:

  • instanceof
  • constructor
  • Object.prototype.toString.call()
语法:typeof [value] =>检测value的数据类型

返回值:使用typeof检测出来的结果是一个字符串,字符串中包含着对应的数据类型,例如:"number"/"string"/"boolen"/"undefined"/"object"/"function"
 
typeof null =>"object" 因为null代表空对象指针(没有指向任何的内存空间)

typeof检测数组/正则/对象,最后返回的都是"object",也就是基于这种方式无法细分对象

面试题:
console.log(typeof []); 
//=>"object"

console.log(typeof typeof []); 
//=>typeof "object"
//=>"string"

2. Тернарный оператор

Синтаксис: условие? Что делать, если оно верно: что делать, если оно неверно; эквивалентно простому решению if/else

var num=12;
if(num>10){
    num++;
}else{
	num--;
}
//=>改写成三元运算符
num>10?num++:num--;

Особый случай

//=>如果三元运算符中的某一部分不需要做任何的处理,我们用 null/undeifned/void 0... 占位即可
var num = 12;
num>10?num++:null;

//=>如果需要执行多项操作,我们把其用小括号包裹起来,每条操作语句用逗号分隔
num=10;
num>=10?(num++,num*=10):null;

мыслительные вопросы

var num = 12;
if(num>0){
	if(num<10){
		num++;
	}else{
		num--;
	}
}else{
	if(num==0){
		num++;
		num=num/10;
	}
}
改写成三元运算符!

3, коммутатор

Метод суждения в JS

var num = 12;
if(num==10){
	num++;
}else if(num==5){
	num--;
}else{
	num=0;
}

//=>改成switch case
switch(num){
	case 10:
		num++;
		break;
	case 5:
		num--;
		break;
	default:
		num=0;	
}

//=>switch case 应用于变量(或者表达式等)在不同值情况下的不同操作,每一种case结束后都要加break(结束整个判断)

Сравнение каждого случая в случае переключения выполняется на основе абсолютного равенства "==="

'10'==10 
=>true 相等比较,如果等号左右两边的类型不一样,首先会转换为一样的数据类型,然后再进行比较
=>当前案例中,就是把字符串'10'转换为数字了,然后再比较的

'10'===10 绝对比较,如果两边的数据类型不一样,则直接不相等,它要求类型和值都完全一样才会相等(真实项目中为了保证代码的严谨性,我们应该更多使用绝对比较)

цикл FOR

Функция: Повторяйте что-то в соответствии с определенным правилом.На данный момент нам нужно использовать цикл, чтобы справиться с этим.

Получить элемент DOM на странице

document.getElementById

Во всем документе объект элемента получается через значение атрибута ID элемента.

getElementById — это метод получения элементов, а документ ограничивает область получения элементов, мы называем эту область: «контекст [контекст]»

var oBox = document.getElementById('box');

1. 同过getElementById获取的元素是一个对象数据类型的值(里面包含很多内置的属性)
typeof oBox  =>"object"

2. 分析包含的属性
className:存储的是一个字符串,代表当前元素的样式类名
id:存储的是当前元素ID值(字符串)

innerHTML:存储当前元素中所有的内容(包含HTML标签)
innerText:存储当前元素中所有的文本内容(没有元素标签)

onclick:元素的一个事件属性,基于这个属性,可以给当前元素绑定点击事件
onmouseover:鼠标滑过事件
onmouseout:鼠标离开事件

style:存储当前元素所有的 "行内样式" 值(获取和操作的都只能是写在标签上的行内样式,写在样式表中的样式,无法基于这个属性获取到)

...

[context].getElementsByTagName

В указанном контексте получить набор элементов по имени тега элемента

Контекст - это то, что мы указываем

var boxList = oBox.getElementsByTagName('li');

1. 获取的结果是一个元素集合(HTMLCollection),首先它也是对象数据类型的,结构和数组非常相似(数字作为索引,length代表长度),但是不是数组,我们把它叫做“类数组”

boxList[0] 获取当前集合中的第一个LI(通过索引获取到具体的某一个LI即可)
boxList.length 获取集合中LI的数量

2. 集合中的每一项存储的值又是一个元素对象(对象数据类型,包含很多的内置属性,例如:id/className...)

boxList[1].style.color='red';  修改集合中第二个LI的文字颜色

функция

В JS функция — это метод (тело функции), а функции обычно используются для достижения определенной функции.

var total=10;
total+=10;
total=total/2;
total=total.toFixed(2);//=>保留小数点后边两位(数字由一个方法toFixed用来保留小数点后面的位数)

....

在后续的代码中,我们依然想实现相同的操作(加10除以2),我们需要重新编写代码
var total=10;
total+=10;
total=total/2;
total=total.toFixed(2);

...

这样的方式会导致页面中存在大量冗余的代码,也降低了开发的效率,如果我们能把实现这个功能的代码进行“封装”,后期需要这个功能执行即可,这样就好了!

函数诞生的目的就是为了实现封装: Инкапсулируйте код, который реализует функцию, в функцию. Если вы хотите реализовать эту функцию позже, вам нужно только выполнить функцию. Нет необходимости снова писать повторяющийся код.低耦合高内聚(减少页面中的冗余代码,提高代码的重复使用率)** роль

function fn(){
	var total=10;
	total+=10;
	total/=2;
	total=total.toFixed(2);
	console.log(total);
}
fn();
fn();
...
想用多少次,我们就执行多少次函数即可

=====
ES3标准中:
//=>创建函数
function 函数名([参数]){
	函数体:实现功能的JS代码
}
//=>函数执行
函数名(); 

=====
ES6标准中创建箭头函数:
let 函数名(变量名)=([参数])=>{
	函数体
}
函数名();

let fn=()=>{
	let total=10;
	...
};
fn();

В качестве одного из справочных типов данных функция также работает в соответствии с ссылочным адресом. Далее давайте узнаем о механизме работы функции.

function fn(){
	var total=10;
	total+=10;
	total=total.toFixed(2);
	console.log(total);
}
fn();

【创建函数】
1. 函数也是引用类型,首先会开辟一个新的堆内存,把函数体中的代码当做“字符串”存储到内存中(对象向内存中存储的是键值对)
2. 把开辟的堆内存地址赋值给函数名(变量名)

此时我们输出fn(切记不是fn())代表当前函数本身
如果我们执行fn(),这是把函数执行
所以是否加小括号是两种不同本质的操作

【函数执行】
目的:把之前存储到堆内存中的代码字符串变为真正的JS代码自上而下执行,从而实现应有的功能

1.函数执行,首先会形成一个私有的作用域(一个供代码执行的环境,也是一个栈内存)
2.把之前在堆内存中存储的字符串复制一份过来,变为真正的JS代码,在新开辟的作用域中自上而下执行 

параметры в функции

Параметр является точкой входа функции: когда мы инкапсулируем функцию в функцию и обнаруживаем, что некоторые исходные материалы неопределенны, пользователь может передать его, когда функция должна быть выполнена.В это время мы можем предоставить запись и выход на основе механизма параметров.

//=>此处的参数叫做形参:入口,形参是变量(n/m就是变量)
function sum(n,m){
	//=>n和m分别对应要求和的两个数字
	var total = 0;
	total = n + m;
	console.log(total);
}

//=>此处函数执行传递的值是实参:实参是具体的数据值
sum(10,20);  //=>n=10 m=20
sum(10); //=>n=10 m=undefined
sum(); //=>n和m都是undefined
sum(10,20,30); //=>n=10 m=20  30没有形参变量接收

Как определить типы данных в JS

  • оператор typeof, используемый для определения типа данных (обычно используется)
  • instanceof проверяет, принадлежит ли текущий экземпляр классу
  • конструктор На основе конструктора находит конструктор текущего экземпляра
  • Object.prototype.toString.call вызывает метод toString для прототипа объекта базового класса.Когда метод выполняется, пусть this в методе становится значением, которое нужно обнаружить, и возвращает информацию о классе, соответствующем текущему значению

console.log(Number(null)); // 0

ноль == не определено: правда

ноль === не определено: ложь

null&&undefined и другие значения не равны

NaN==NaN: ложь NaN не равен никому, в том числе и себе =============================> Вышеупомянутое требует специальной памяти

1==true =>true
1==false =>false
2==true =>false  规律不要混淆,这里是把true变为数字1


[]==true:false  都转换为数字 0==1
![]==true:false

[]==false:true  都转换为数字 0==0
![]==false:true  先算![],把数组转换为布尔取反=>false  =>false==false