记一次UC的面试

1. setTimeout setInterval setImmediate

setTimeout

定义与用法:setTimeout是用于在指定毫秒数后执行调用函数或计算表达式

语法: setTimeout(code,millisec)

参数: code (必需):要调用的函数后要执行的 JavaScript 代码串。millisec(必需):在执行代码前需等待的毫秒数。   提示: setTimeout() 只执行 code 一次。如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout()。

setInterval

定义与用法:setInterval()方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。

语法: setInterval(code,millisec[,"lang"])

参数: code 必需。要调用的函数或要执行的代码串。millisec 必须。周期性执行或调用 code 之间的时间间隔,以毫秒计。

返回值:一个可以传递给 Window.clearInterval() 从而取消对 code 的周期性执行的值。

setInterval

定义与用法:setInterval()方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。

语法: setInterval(code,millisec[,"lang"])

参数: code 必需。要调用的函数或要执行的代码串。millisec 必须。周期性执行或调用 code 之间的时间间隔,以毫秒计。

返回值:一个可以传递给 Window.clearInterval() 从而取消对 code 的周期性执行的值。

区别

setTimeout只运行一次,也就是说设定的时间到后就触发运行指定代码,运行完后即结束。如果运行的代码中再次运行同样的setTimeout命令,则可循环运行。(即 要循环运行,需函数自身再次调用 setTimeout())

而 setinterval是循环运行的,即每到设定时间间隔就触发指定代码。这是真正的定时器。

setinterval使用简单,而setTimeout则比较灵活,可以随时退出循环,而且可以设置为按不固定的时间间隔来运行,比如第一次1秒,第二次2秒,第三次3秒。

setImmediate()

setImmediate()是将事件插入到事件队列尾部,主线程和事件队列的函数执行完成之后立即执行setImmediate指定的回调函数,和setTimeout(fn,0)的效果差不多,但是当他们同时在同一个事件循环中时,执行顺序是不定的。另外setTimeout和setImmediate也有一定的区别.

2.Ajax

面试官问了几个,怎样输出一个对象,错误的情况是什么输出,多重嵌套的问题,跨域问题,端口不同算不算跨域,jsonp能用post?
data.products[i].name
错误的情况:当通过ajax异步调用出错时,会调用 error函数 。

JSONP:为了保证用户访问的安全,现代浏览器使用了同源策略,即不允许访问非同源的页面,在ajax中,不允许请求非同源的URL,比如www.a.com下的一个页面,其中的ajax请求是不允许访问www.b.com/c.php这样一个页面的

原理:ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

同源策略:

请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.

下面是是几种使用Jsonp进行跨域的例子

1.将前端代码中的ajax请求去掉,添加了一个script标签,标签的src指向了另一个域www.practice-zhao.com下的remote.js脚本




    GoJSONP








这里调用了跨域的remote.js脚本,remote.js代码如下:

jsonhandle({
    "age" : 15,
    "name": "John",
})

弹出了提示框 :age:15name:john

2.将前端代码修改下,添加了一个script标签,src指向跨域的一个php脚本,并且将上面的js函数名作为callback参数传入




    GoJSONP








php的代码为:

 20,
    'name' => '张三',
);

$callback = $_GET['callback'];

echo $callback."(".json_encode($data).")";
return;

php返回的js语句为:

jsonhandle({
    "age" : 15,
    "name": "张三",
})

3.JQuery版的jsonp

注意,jsonp的type只能为get!!!!




    GoJSONP






谈谈es6

let, const, class, extends, super, arrow functions, template string, destructuring, default, rest arguments

let, const

这两个的用途与var类似,都是用来声明变量的

var name = 'zach'

while (true) {
    var name = 'obama'
    console.log(name)  //obama
    break
}

console.log(name)  //obama


使用var 两次输出都是obama,这是因为ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。第一种场景就是你现在看到的内层变量覆盖外层变量。而let则实际上为JavaScript新增了块级作用域。用它所声明的变量,只在let命令所在的代码块内有效。

var name = 'zach'

while (true) {
    let name = 'obama'
    console.log(name)  //obama
    break
}

console.log(name)  //zach

另外一个var带来的不合理场景就是用来计数的循环变量泄露为全局变量,看下面的例子:

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10

上面代码中,变量i是var声明的,在全局范围内都有效。所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i的值。而使用let则不会出现这个问题。

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

const

也用来声明变量,但是声明的是常量。一旦声明,常量的值就不能改变。

Class(类),extends, super

arrow function(箭头函数)

function(i){ return i + 1; } //ES5
(i) => i + 1 //ES6

如果方程比较复杂,则需要用{}把代码包起来:

function(x, y) { 
    x++;
    y--;
    return x + y;
}
 return  (x,y)=>{x++;y--; return x+y}

sql语法

1.查询10~20 之间的数据
两个表的关联
join 的用法

mysql> SELECT * FROM table LIMIT 20,10;  // 检索记录行 21-30    



sql server>
 select   *   from      
 (select   *,   ROW_NUMBER()   OVER   (order   by   ID)   AS   ROWNUM   from   表) t   
 where   ROWNUM   between   21   and   30  
 
 
 
两个表的关联:
用法1、select  *  from  表A   left  join  表B   on   表A.sid=表B.id
用法2、select  (select 字段  from  表B  where  表B.id=表A.sid)

JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行



你可能感兴趣的:(记一次UC的面试)