JavaScript 面试题(一)

一、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;
标识符
nameauth
sex
age18

引用类型:
(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( ); // 获取日期与时间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值