【面试利器】原生JS灵魂拷问,你能答上多少(二)

  • || 两个操作数只要有一个为 true ,条件判断的结果就为 true ,因此操作数一为 true 时,不会判断操作数二。
  1. 返回值规则
  • ||&& 首先会对操作数一执行条件判断,如果不是布尔值就先强制转换为布尔类型,然后再执行条件判断。

  • 对于 || 来说,如果条件判断结果为 true 就返回第一个操作数的值,如果为 false 就返回第二个操作数的值。

  • && 则相反,如果条件判断结果为 true 就返回第二个操作数的值,如果为 false 就返回第一个操作数的值。

  • ||&& 返回它们其中一个操作数的值,而非条件判断的结果

  1. (2<3)||(3<2)返回值是多少?

第十七问 1 + - + + + - + 1结果是多少?

+/- 号在 JavaScript 通常有三种用途:

  • 普通加减法: 二元运算符

  • ++/--: 自增自减,一元运算符

  • +/-: 正负,一元运算符

上面表达式中没有涉及自增与自减的情况,一元运算符的优先级大于二元运算符,上述表达式执行顺序为:

1 + (- (+ (+ (+ (- (+ 1)))))) ----> 1 + 1 = 2

第十八问 你会用位运算符吗?

  1. 判断奇偶数

二进制的奇数最低位是1,偶数最低位是0,可以通过& 1运算后可以判断奇偶。

num & 1 === 1 // num 为奇数

num & 1 === 0 // num 为偶数

  1. 交换a,b的值

可以采用异或来实现两个变量值的交换

let a = 1

let b = 2

a ^= b

b ^= a

a ^= b

console.log(a) // 2

console.log(b) // 1

  1. 取整

~~num

第十九问 你能准确的做出自增与自减的题目吗?

请回答:y 的值为?

var x = 1;

var y = x + ++x + 3 * (x = ++x + x + x++ + 1)

  • x++ + 3;

console.log(y);

咱们来解剖一下这个长的要死的表达式:

第一个x值为1

第二个自增先加后用,x = 2

将 ++x + x + x++ + 1 的运算结果赋值给x

++x 先加后用,x = 3

x = 3

x++ 先用后加,x = 3

++x + x + x++ + 1 = 3 + 3 + 3 + 1 = 10

x++的后加,x = 4

将表达式的值赋给x,x由4变为10

x++ 先用后加,x = 10

此时所有的变量都已经求出

y = 1 + 2 + 3*10 + 10 + 3 = 46

x++,x最终值为11

第二十问 你知道new运算符的有两种优先级吗?

MDNnew 操作符的描述中,语法是:

new constructor[([arguments])]

([arguments]) 意味着可以缺省,会存在 new constructor(...args)new constructor 两种模式,并且前者的优先级高于后者。更详细的优先级见下图:

在这里插入图片描述

这个知识点非常重要,只有区分开了 new 带参列表和不带参列表,才能准确并且透彻的理解下面这道面试题。

function Foo(){

getName = function(){ console.log(1); };

return this;

}

Foo.getName = function(){ console.log(2); };

Foo.prototype.getName = function(){ console.log(3); };

var getName = function(){ console.log(4); };

function getName(){ console.log(5) };

Foo.getName();

getName();

Foo().getName();

getName();

new Foo.getName();

new Foo().getName();

JavaScript字符串之问


第二十一问:你知道toString()的妙用吗?

  1. 可以转换数字的进制(2-36)

// 参数为要转换的进制

var a = 10;

a.toString(2) // “1010”

a.toString(8) // “12”

a.toString(16) // “a”

  1. 可以生成随机验证码

利用 toString 的进制转换,可生成随机验证码

Math.random().toString(36).substring(3,7) //生成四位数的随机验证码

  1. 判断数据类型

toString.call(()=>{}) // [object Function]

toString.call({}) // [object Object]

toString.call([]) // [object Array]

toString.call(‘’) // [object String]

toString.call(22) // [object Number]

toString.call(undefined) // [object undefined]

toString.call(null) // [object null]

toString.call(new Date) // [object Date]

toString.call(Math) // [object Math]

toString.call(window) // [object Window]

第二十二问:字符串是原始值,那为什么可以调用字符串方法那?

原始值是没有属性也没有方法的,那为什么字符串可以调用方法那?

JavaScript 为了便于基本类型操作,提供了三个特殊的引用类型(包装类),即 Number,String,Boolean ,它们的 [[PrimitiveValue]] 属性存储它们的本身值。

光说这些有可能有些难理解,咱们来举个例子:

var str = ‘zcxiaobao’

str2 = str.toUpperCase()

其实js引擎内部会这样处理:

var str = ‘zcxiaobao’

// 调用方法,创建String的一个实例

new String(str)

// 调用实例上的方法,并将值返回

str2 = new String(str).toUpperCase()

// 销毁实例

但这里有一个需要注意的点,new String('1')'1' 类型相同吗,我们来测试一下:

var str1 = new String(‘1’);

var str2 = ‘1’;

console.log(str1 === str2); // false

console.log(str1 == str2); // true

console.log(typeof(str1)) // object

// new String()得到的字符串为object格式

第二十三问:修改string.length大小能改变字符串长度吗?为什么?

先看一个示例:

var str = ‘123456’;

str.length = 0;

console.log(str, str.length); // 123456 6

很明显,修改 str.length 是无法做到修改字符串的长度的。

原因跟第二十二问是相同的,str 为原始值,调用 length 相当用 new String(str).length,修改的是 new String(str)length ,跟原始值 str 无关。

第二十四问:修改new String()生成字符串的length会生效吗?为什么?

如果将上面代码修改一下,str 是由 new String 产生,修改 length 属性会生效吗?

var str = new String(‘123456’);

str.length = 0;

console.log(str, str.length); // String {“123456”} 6

答案告诉我们,还是失败了。

二十三问中:new String() 生成的字符串是对象类型,为啥还不能使用 length 属性。那说明 length 属性,很有可能配置了不可写,测试一下上述猜想:

Object.getOwnPropertyDescriptor(str, ‘length’)

/*

{

value: 6,

writable: false,

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-59sYzdl0-1715798421798)]

[外链图片转存中…(img-f1EKPe0w-1715798421799)]

[外链图片转存中…(img-JnYHaG8B-1715798421799)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值