- 写代码:实现 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));
代码语言: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()