一、js的基本类型有哪些?引用类型有哪些?基本类型和引用类型的区别
1、基本数据类型
number、string、boolean、null、undefined
2、引用数据类型
function、object、Array
3、基本类型和引用类型的区别
基本类型:
(1)基本类型的值是不可变的,任何方法都无法改变一个基本类型的值
let name = 'auth'
name.toUpperCase() // 输出 ‘AUTH’
console.log(name) // 输出 ‘auth’
使用toUpperCase方法后name的值并没有改变。
let name = 'auth'
name.first = 'zhao'
name.fnc= function (){}
console.log(name.first ) // 输出 undefined
console.log(name.fnc) // 输出 undefined
给name添加一个first属性,输出undefined,说明不可以给基本类型添加属性和方法
(2)基本类型的比较的是值
(3)基本类型的变量存放在栈区(栈内存) 栈区包括了 变量的标识符和变量的值。
var name = 'auth';
var sex= '男';
var age = 18;
标识符 | 值 |
---|---|
name | auth |
sex | 男 |
age | 18 |
引用类型:
(1)引用类型的值是可以改变的,可以拥有属性和方法
let obj = {}
obj.name = 'auth'
obj.fnc = function () { console.log(obj.name) }
obj.fnc()// 输出‘auth’
delete obj.name // 删除obj中的name属性
(2)引用类型同时存储在栈区(栈内存)和堆区(堆内存)中,栈区存储变量标识符和指向堆区中该对象的指针,也可以说是该对象在堆区的地址
let person1 = {name:'first'}
let person2 = {name:'second'}
let person3 = {name:'third'}
(3)引用类型比较的是内存地址
let obj1 = {}
let obj2 = {}
console.log(obj1 == obj2) // 输出false
虽然都是空对象,但是他们指向的内存地址不同
基本类型定义变量后,给另一变量赋值,他们是相互不影响的
let a = 10;
let b = a;
a++
console.log(a) // 11
console.log(b) // 10
引用类型定义变量后,给另一变量赋值,他们指向同一内存地址
let a = {};
let b = a;
a.name = 'auth'
console.log(a.name) // 'auth'
console.log(b.name) // 'auth'
console.log(a == b);// true
二、如何判断 JavaScript 的数据类型
1、typeof 可以用来区分除了 Null 类型以外的原始数据类型
typeof undefined // "undefined"
typeof null // "object"
typeof {} // "object"
typeof 1 // "number"
typeof "1" // "string"
typeof Symbol() // "symbol"
typeof function() {} // "function"
相关问题:
(1)typeof 不能识别 null,如何识别 null?通过===全等运算符判断是否为null
let a = null
console.log(a === null) //true
(2)typeof 作用于未定义的变量,会报错吗?
typeof undefined // 不会报错,返回'undefined'
(3)typeof Number(1)的返回值是什么?
Number 和 String 作为普通函数调用的时候,是把参数转化为相
应的原始数据类型,也就是类似于做一个强制类型转换的操作,而不是默认当做构造函数
调用。注意和 Array 区分,Array(…)等价于 new Array(…)
typeof Number(1) // "number"
typeof String("1") // "string"
Array(1, 2)
// 等价于
new Array(1, 2)
(4)typeof new Number(1)的返回值是什么?
typeof new Number(1) // "object"
typeof new String(1) // "object"
三、创建函数的几种方法
1、函数声明
function sum (num1, num2) {
return num1 + num2
}
2、函数表达式
let sum = function (num1, num2) {
return num1 + num2
}
3、函数对象方式
let sum = new Function("num1","num2","return num1+num2");
四、=== 和 == 的区别
=== 既判断内容的值,也判断类型。
当等号两边的值为相同类型的时候,直接比较等号两边
的值,值相同则返回 true,若等号两边的值类型不同时直接返回 false。
== 只判断值是否相等
当等号两边的值为相同类型时比较值是否相同,类型不同
时会发生类型的自动转换,转换为相同的类型后再作比较。
五、null,undefined 的区别
null 表示一个对象被定义了,值为“空值”;
undefined 表示不存在这个值
六、JavaScript 中什么情况下会返回 undefined 值?
1、变量声明但是没有赋值
var a;
console.log(a) // undefined
2、访问不存在的属性
var a = { };
console.log(a.name) // undefined
3、访问函数的参数没有被传递时
(function (b){
console.log(b); // undefined
})();
4、被设置为undefined的值
var a = undefined;
console.log(a) // undefined
5、没有定义 return 的函数隐式返回
function a(){}console.log(a()); // undefined
6、函数 return 没有显式的返回任何内容
function a(){
return;
}
console.log(a()); // undefined
七、如何判断数组和对象?
1、通过 ES6 中的 Array.isArray 来识别
let a = [];
let b = {};
Array.isArray(a) //true
Array.isArray(b) //false
2、通过 instanceof 来识别
let a = [];
let b = {};
a instanceof Array //true
b instanceof Array //false
3、通过调用 constructor 来识别
let a = [];
let b = {};
a.constructor //返回 object
b.constructor //返回 Array
4、通过 Object.prototype.toString.call 方法来识别
let a = [];
let b = {};
Object.prototype.toString.call(a) //["object Array"]
Object.prototype.toString.call(b) //["object Object"]
八、怎么判断两个对象相等?
ES6的方法Object.is(),这个方法判断是两个对象引用地址是否一致,当需求是比较两个对象内容是否一致时就没用了
let obj1 = { name: 'auth' }
let obj2 = { name: 'htua' }
console.log(Object.is(obj1, obj2)) // false
let obj3 = obj1
console.log(Object.is(obj1, obj3)) // true
console.log(Object.is(obj2, obj3)) // false
想要比较两个对象是否完全一致,要遍历对象的所有键名和键值是否都一致:
1、先判断两个对象引用地址是否一致
2、引用地址一直后,取出两个对象的键和值进行遍历,依次进行比对。使用 Object.getOwnPropertyNames 获取对象所有键名数组
九、列举三种强制类型转换和两种隐式类型转换?
1、强制转换
转换成字符串 toString() String()
转换成数字 Number() paresInt() parseFloat()
转换成布尔类型 Boolean()
2.隐式转换
字符串拼接
let str = "" + 18
十、JavaScript 中怎么获取当前日期?
new Date; // Sat Jul 06 2021 15:59:27 GMT+0800 (中国标准时间)
let year = date.getFullYear();获取当前年份
let month = date.getMonth() + 1;获取当前月
let day = date.getDay();获取当前日
获取当前日期(年-月-日):
month = (month > 9) ? month : ("0" + month);
day = (day < 10) ? ("0" + day) : day;
let today = year + "-" + month + "-" + day; //
2021-12-28
另外的一些操作:
date.getYear(); // 获取当前年份(2 位)
date.getFullYear(); // 获取完整的年份(4 位, 1970-????)
date.getMonth(); // 获取当前月份(0-11,0 代表 1 月)
date.getDate(); // 获取当前日(1-31)
date.getDay(); // 获取当前星期 X(0-6,0 代表星期天)
date.getTime(); // 获取当前时间(从 1970.1.1 开始的毫秒数)
date.getHours(); // 获取当前小时数(0-23)
date.getMinutes(); // 获取当前分钟数(0-59)
date.getSeconds(); // 获取当前秒数(0-59)
date.getMilliseconds(); // 获取当前毫秒数(0-999)
date.toLocaleDateString(); // 获取当前日期
date.toLocaleTimeString(); // 获取当前时间
date.toLocaleString( ); // 获取日期与时间