字节跳动前端面试代码题一

2024-01-18 20:07:03 浏览数 (1)

  • 写代码:实现 ES6 语法中的 const 声明 使用 ES5 var 怎么去做?
代码语言:javascript复制
// 使用es5 的语法 去实现 ES6 中的 const 的声明
// 首先我们要知道 const 有什么特性:
- 不能重新定义
- 不能重新赋值
- 语义化标识,表示声明后不可更改的不变量
- 声明时 完成 初始化
// 本质上:const 所保证的并不是变量的值不可改变 而是 变量所指向的内存地址不可改变 简单的数据类型保存在内存地址中 等同于常量
	var _const=function(param,value){
		// 使用一个对象 这里设置成 window
		var _global = window;
		// 判断要声明的 param 是否合法   不可以是关键字
		var key_arr = ['class','var','let','const','return']// 还可以在增加限定关键字
		if(!param || key_arr.indexOf(param)>-1){
			throw new Error(`${param} 属于关键字 声明不合法`)
		}
		// 判断是否已经存在了
		if(_global.hasOwnProperty(param)){
			throw new Error(`${param} 已经被声明过了`)
		}
		// 给 _global 添加属性 param 
		_global[param] = value;
		// 使用定义属性方法  defineProperty
		Object.defineProperty(_global,param,{
			get:function(){
				return value;
			},
			set:function(){
				// 检查赋值 已经存在了 不可再进行赋值
				if(_global.hasOwnProperty(param)){
					throw new Error(`${param} 不可再进行赋值`)
				}
				return value;
			}
		})
	}
  • 写代码:输入一串含有 ()、[] 、{ } 的字符串 写代码做出检查 括号要成对
代码语言:javascript复制
// 检查合法性 对于一个字符检查括号的合法性 如 () [] {}
	var checker = (str)=>{
		var len = str.length;
		if(len <= 1){
			return false;
		}
		// 定义三个空数组 采用进栈出栈的方式去做判断
		var arr_little = [] ,arr_middle = [], arr_big = [];
		for(var i = 0 ; i < len ; i  ){
			if(str[i]==="("){
				arr_little.push("(");
			}else if(str[i]===")"){
				if(arr_little.length==0){
					return false;
				}
				arr_little.pop();
			}else if(str[i]==="["){
				arr_middle.push("[");
			}else if(str[i]==="]"){
				if(arr_middle.length==0){
					return false;
				}
				arr_middle.pop();
			}else if(str[i]==="{"){
				arr_big.push("{");
			}else if(str[i]==="}"){
				if(arr_big.length==0){
					return false;
				}
				arr_big.pop();
			}else{
				return false
			}
		}
		// 判断 数组的个数为0
		if(arr_little.length==0 && arr_middle.length==0 && arr_big.length == 0){
			return true;
		}
		else
			return false;
	}
  • 写代码:输入一个有序数组 输出一个无序数组
代码语言:javascript复制
function randArr(arr){
	let len=arr.length;
	for(let i = 0;i < len;i   ){
		let index=parseInt(Math.random()*len-1);
		let temp=arr[i];
		arr[i]=arr[index];
		arr[index]=temp;
	}
	return arr;
}
let arrNew=[1,2,3,4,5];
console.log(randArr(arrNew));
  • Promise 以及 它有几种状态呢
代码语言:javascript复制
Promise  对象用于表示一个异步操作的最终完成 (或失败), 及其结果值.
// Promise 是一种异步处理 有三种状态  pending (初始化状态) fulfilled (执行完成成功) rejected (执行失败)
// 当状态发生改变了就会去触发 then() 方法 无论是 pending-->fulfilled  还是 pending-->rejected 的状态都可以触发 then()
/* 优点 
	* 1 解决回调
	* 2 解决嵌套
	* 3 分离链式调用 
	*/
// 1. 实例化Promise
	var myPromise = new Promise(function(resolve,reject) {
		// body...
		console.log("promise 的 创建完成 ");
		setTimeout(function(){
			resolve();
		},3000)
	});
	myPromise.then(function(){
		console.log("成功 回调")
	})
  • 怎么产生的跨域 几种解决方法 都是怎么解决的
代码语言:javascript复制
// 浏览器的同源策略 即相同协议 端口 域名 下允许相互通信  三者有一个不同便会引起跨域问题
1.jsonp的方式,只针对于get请求
2. window.domain 在不同源中设置 相同的 window.domain 来实现跨域  但是局限于 基础域相同、协议端口都要相同
3. window.name iframe 常用 
	在父页面上有个iframe嵌入了异源的html 异源的html中将数据赋值给window.name 
	父页面获取数据前,将iframe中的异源html替换为同源的html 此时里面的window.name 不会因为src改变而改变,所以就得到了来自异源的数据
4. CORS 服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。
5. H5 中新引进的 window.postMessage()

0 人点赞