首页 > 其他分享 >面试1

面试1

时间:2024-03-08 17:01:02浏览次数:13  
标签:return Symbol Object 面试 obj false null

1.为什么 typeof null  = 'object'

是通过类型标记位,而 null 是一个固定的值。开头为 000 000: object 001: integer 010: double 100: string 110: boolean   2. + 操作转化为数字 传统数据类型 toNumber(null)   0 toNumber(undefined)  NaN toNumber(1)   1 toNumber("123aa")  NaN toNumber({})  NaN toNumber(true)  1 toNumber([])  0.  /. [0] = 0. /. [1] = 1.  /. [0, 1] = NaN
ES6的 bigInt和Symbol   报错 toNumber(10n) toNumber(Symbol.for("a")).    Symbol.for('1')  先找看有没有,有就返回,没有就新建,参数 哪怕是复杂数据类型 也是一样的 比如: Symbol( { a: 1, b: { c: 2 } } )   Symbol.keyFor( ss ) 参数是Symbol: 返回一个已登记的 值,如果是一个 复杂类型的 数据 返回 "[object Object]"     ["1", "2", "3"].map(parseInt). 返回 [1, NaN, NaN] 当进制是 0 表示为 默认值 10,最小值为 2,如果 以 0X开头表示 16进制   in 操作符  可以判断 是否在对象中,或者原型对象中     == 判断的依据 null == 0 / false '0' == false 1. 只要有一个是 boolean,先将  bool 转化为 数字 2. null 和 undefined 不进行转化 3. 2个操作数是对象的话,比较是否指向同一个对象 4. 有一个是字符串,另一个是数字,先将字符串转化为数字 5. 一个是对象,一个不是,需要先将其转化为基本类型,调用 valueOf() / toString JS规定 undefined 和 null 相等,因为 undefined是从 null 衍生出来的   toString是把对象转换为字符串;
valueOf是把对象转换成一个基本数据的值
  ===严格比较运算符,不做类型转换,类型不同就是不等 Object.is 与 === 基本一致(不同 NaN 和 NaN 相等 /  +0 不等于 -0)       Object.getOwnPropertyDescriptor(globalThis, "undefined").  null 则返回 undefined 返回一个对象 writable / configurable / enumerable = false   typeof 判断不再 安全 可能会报错   String.prototype.constructor = function() {}. 可以被改写,但是是不生效的   为定义的变量。使用 typeof 不会 报错。instanceOf 会报错(右边必须是 函数或者 类)  
1 var frame = window.frames[0];
2 var isInstanceOf = [] instanceof frame.Array;
3 console.log("frame.Array", frame.Array);
4 console.log("isInstanceOf", isInstanceOf)  false

判断 类型

1.  使用 typeof  缺点:判断不出 Array 和 Object

2. 使用 instanceof. 

3. 使用 Object.prototype.toString.call(this, ...) 返回  [object, Object]

为什么会返回这个? 可以自定义

1 class MyArray {
2     get [Symbol.toStringTag](){
3         return "MyArray"
4     }
5 }
6 
7 var pf = console.log;
8 var a = new MyArray();
9 Object.prototype.toString.call(a)。返回 [object, MyArray]

 

Number.isNaN 和 isNaN 的区别

1. isNaN 会尝试转化为 数字,成功则 true,否则 false

2. Number.isNaN  直接判断

isNaN('aaa') // 会尝试将其转化为 数字。 true
Number.isNaN('aaa') // 不会转化       false
Number.isNaN = function (val) {
   return typeof val === "number" && isNaN(val);
};

 

千分位

/hello (?=[a-z]+)/.test("hello a")
function format_with_regex(number) {
    var reg = /\d{1,3}(?=(\d{3})+$)/g;
    return (number + '').replace(reg, '$&,');
}

 

Symbol.toPrimitive 的使用

let obj = {
  [Symbol.toPrimitive](hint) {
    switch (hint) {
      case 'number':
        return 123;
      case 'string':
        return 'str';
      case 'default':
        return 'default';
      default:
        throw new Error();
    }
  },
};
2 * obj; // 246
3 + obj; // '3default'
obj == 'default'; // true
String(obj); // 'str'

[].valueof()     得到 []

[].toString().   得到 ‘’

[2] + 2          得到 ‘22’

[] + { } = '[object Object]'. /. {} + [] = 0 / { } + { } = NaN. / [] + [] = ''

 

[][Symbol.ToPrimitive]  = undefined。 { } 也是一样

.valueof()  {}. /. .toString(). '[object Object]' 

 

对象输出的顺序: 

let obj = { 1: 'a', 2: 'b', 6: 'c', a: 'd', f: 'f' }

 

 

class Person {
    constructor(name, age){
        this.name = name
        this.age = age
    }
    
    getName = ()=> {
        return this.name
    }
    
    getAge(){
        return this.age
    }
}

getName 是在创建 对象里面,而 getAge在原型对象上

Object.hasOwnProperty。用于判断是否是本身就有 Object.getOwnPropertyDescriptor(obj, "name")。获取描述器   Object.defineProperty(obj, "name", { })  不写内容,默认里面 全是 false,所以 使用 obj.name = 1 无效   configurable:false 不能删除,也不能重新定义 enumerable: false 不能被 keys 遍历出来 writable: false  不能被修改

 

const obj = {. }

Object.defineProperty(obj, 'name', {. }) 默认得到的都是 false

 

Object.preventExtensions( obj ) 不能添加新属性,但是可以删除

Object.isExtensible(obj1)    是否可以扩展属性

Object.seal( obj ) 不能删除/增加属性,只能修改本属性。 和下面一样只对 第一层有效

Object.freeze( obj ) 同上,也不能修改本属性

Object.isFrozen( obj )  判断是 freeze 对象

 

Object.getPrototypeOf. 用于获取指定对象的原型。 null 和 undefined 报错 Object.setPrototypeOf(obj, null)。也会生效  

Object.prototype.toString.call(Boolean.prototype). ==>. [object, Boolean]

 

Object.getOwnPropertyNames 包含可枚举属性和不可枚举属性,不包括 symbol Object.ownKeys 包含所有属性,包括不可枚举属性和 symbol for 循环 不能遍历出 不可枚举对象 / symbol 也不能

 

Object.create(Prototype) 创建一个对象,并且 obj.__proto__ = Prototype

Object.setPropertyOf(obj,  Prototype).  obj.__proto__ = Prototype

 

私有属性。#canBack = 123

手写 instanceof

function instanceOf(instance, cclass) {
  let proto = instance.__proto__;
  let prototype = cclass.prototype;

  while (proto) {
    if (proto === prototype) return true;
    proto = proto.__proto__;
  }
  return false;
}

对象不能 使用 for. of 遍历。obj[Symbol.iterator]

 

标签:return,Symbol,Object,面试,obj,false,null
From: https://www.cnblogs.com/escapist/p/18060788

相关文章

  • Vue面试题
    1、active-class是哪个组件的属性?嵌套路由怎么定义?答:vue-router模块的router-link组件。 2、怎么定义vue-router的动态路由?怎么获取传过来的动态参数?答:在router目录下的index.js文件中,对path属性加上/:id。 使用router对象的params.id 3、vue-router有哪几种导航钩子? ......
  • 前端中级面试
     js原理题1.什么是闭包,举个例子说明一下?答:“闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。”举例:创建闭包最常......
  • 软件测试经典面试题:如何测微信的朋友圈?
    这是一道非常经典的面试题,相信很多小伙伴在面试中都被面试官问到过这个问题,想要回答好这个面试题,我们首先要搞清楚面试官在考察候选者什么方向测试技能。其实不难猜出,面试官主要是想考察候选者测试用例设计能力。一般会从以下两个方面来考察候选者:1、测试用例设计的全面性2、测试......
  • python面试题 :进程、线程、协程的区别
    进程、线程和协程区别1.进程进程是系统资源分配的最小单位,系统由一个个进程(程序)组成一般情况下,包括文本区域(textregion)、数据区域(dataregion)和堆栈(stackregion)。文本区域存储处理器执行的代码数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动......
  • 集合常见的面试题
    集合常见的面试题1、你在开发种常用的集合有哪些?如果没有特殊要求,且元素是单列元素的话,使用ArrayList居多,如果是键值对元素的话,默认使用HashMap居多其他的集合根据查询或者增删的需求,或者线程安全或不安全来选择。2、HashMap和Hashtable的区别共同点:都是实现了Map接口的实现......
  • 算法面试通关40讲
    三分学七分练数组、链表leetcode21site#include<iostream>usingnamespacestd;structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}ListNode(intx):val(x),next(nullptr){}ListNode(intx,ListNode*next)......
  • 面试官让说出8种创建线程的方式,我只说了4种,然后挂了。。。
    写在开头昨天有个小伙伴私信说自己面试挂在了“Java有几种创建线程的方式”上,我问他怎么回答的,他说自己有背过八股文,回答了:继承Thread类、实现Runnable接口、实现Callable接口、使用线程池这四种,但是面试官让说出8种创建方式,他没说出来,面试就挂了,面试官给的理由是:只关注八股文背......
  • 面试高频题:Java并发包有些什么?
    面试过Java研发岗位的同学,相信很多都碰到过面试官问这么一道题:Java并发包有些什么?Java并发包,就是java.util.concurrent包下的类和子包。大体分为三类:一:线程池工具 核心类为ThreadPoolExecutor,通过这个类,可以构建出各种线程池。二:原子工具如AtomicInteger、AtomicLong等,通......
  • MySQL面试题
    MySQL隔离级别并发访问数据库时存在的问题脏读:又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改但是还未提交,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改并提交,这就导致了T2所读取到的数据是无效的,值得注意的是,脏读一般是针对于update操作的。不可重复读:是......
  • 面试官:说说微服务灰度发布的底层实现?
    微服务中的灰度发布(又称为金丝雀发布)是一种持续部署策略,它允许在正式环境的小部分用户群体上先部署新版本的应用程序或服务,而不是一次性对所有用户同时发布全新的版本。这种方式有助于在生产环境中逐步验证新版本的稳定性和兼容性,同时最小化潜在风险,不影响大部分用户的正常使用......