整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

云计算核心技术Docker教程:Docker数据卷的使用

生产环境中使用 Docker,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束)或者需要在多个容器之间进行数据共享,需要将数据从宿主机挂载到容器中,这就会涉及容器的数据管理操作。

Docker数据卷(data volume,注:位置在/var/lib/docker/volumes)是容器可以访问,但是位置不在root文件系统中的一个目录。为了能让容器之间可以共享数据,Docker让“卷”(volume)可以绕过Docker镜像的层叠机制。容器中所有对镜像的改变全部都直接存储。每个容器都有固定的运行目录在/var/lib/docker目录下;而每个容器卷的数据则默认单独存储在/var/lib/docker/volumes/目录底下。 docker run命令的-v选项能够实现容器间数据卷中数据的互相拷贝。

数据卷Volume的基本使用:

1.管理卷

创建一个自定义容器卷

$ docker volume create my-vol

查看所有容器卷

$ docker volume ls

查看指定容器卷详情信息

$ docker volume inspect my-vol

2.创建使用指定卷的容器

有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以nginx为例:

$ docker run -d -it --name=my-vol -p 8800:80 -v edc-nginx-vol:/usr/share/nginx/html nginx

其中,-v代表挂载数据卷,这里使用自定数据卷my-vol,并且将数据卷挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。

如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。

3.删除一个卷

$docker volume rm my-vol

Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷,无主的数据卷可能会占据很多空间,所以要及时删除。

本文源自TechWeb.com.cn

1、唐山海港经济开发区医疗事业单位2019年公开招聘工作人员公告。

2、滦南县有关单位2019年公开招聘辅助工作人员公告。

3、玉田县关于公开补招劳务派遣交警大队警务辅助人员的公告。

4、玉田县关于公开招用劳务派遣退役军人管理服务人员公告。

▼▼▼

唐山海港经济开发区

医疗事业单位2019年公开招聘工作人员公告

唐山海港经济开发区拟面向社会公开招聘事业编制工作人员11名,选聘4名。

一、招聘原则

事业单位招聘坚持德才兼备和公开、平等、竞争、择优的原则,在考试、考察的基础上择优聘用。

二、招聘条件、岗位、人数

(一)应聘人员应具备以下基本条件

1、具有中华人民共和国国籍。

2、公开招聘人员年龄在18周岁以上、35周岁以下(1983年7月31日至2001年7月31日期间出生)。

选聘人员年龄在18周岁以上、40周岁以下(1978年7月31日至2001年7月31日期间出生),在二甲及以上医院担任相应科室主任或技术带头人,副高及以上专业技术职务任职资格且具有研究生(硕士学位)及以上学历的,年龄放宽至45周岁(1973年7月31日以后出生)。

3、遵守宪法和法律。

4、具有良好的品行和职业道德。

5、适应岗位要求的身体条件。

(二)招聘人数和岗位条件

按照《2019年公开招聘工作人员岗位条件表》的条件和岗位进行。

(点击图片放大查看)

留学回国人员和其他海外、外国学历学位获得者需取得国家教育部或省级教育行政部门出具的学历认证报告,其所学专业名称与招聘岗位要求专业名称不完全一致的,如果所学专业课程与招聘岗位专业课程大部分相同,且符合该岗位所需要的其他条件的,也可报考该招聘岗位。

招聘学历为全日制普通类专科、本科及全日制硕士研究生的,需具有学历底限层次及以上的就业报到证(派遣证)。招聘学历为“硕士或博士”的,需专科、本科是全日制普通类高等院校毕业,且具有本、专科就业报到证(派遣证)。报名审核环节暂不需要提供报到证(派遣证),待考核环节结束后由用人单位验证核实。

(三)有下列情形之一的人员不得报考

截止到报名时,现役军人、试用期(服务期)内的公务员、2020年及以后毕业的全日制普通类高校在读学生,不在招聘范围。

曾因犯罪受过刑事处罚和被开除公职的人员、失信被执行人,以及法律法规规定不得招聘为事业单位工作人员的其他情形人员,不得报考。

此外,应聘人员不得报考聘用后即构成回避关系的招聘岗位。回避关系是指《河北省事业单位公开招聘工作人员暂行办法》第四十一条关于“凡与聘用单位负责人员有夫妻关系、直系血亲关系、三代以内旁系血亲或者近姻亲关系的应聘人员,不得应聘该单位负责人员的秘书或者人事、财务、纪律检查岗位,以及有直接上下级领导关系的岗位。聘用单位负责人员和招聘工作人员在办理人员聘用事项时,涉及与本人有上述亲属关系或者其他可能影响招聘公正情形的,也应当回避。

三、招聘程序

(一)报名要求。

1、每名报考人员只能报考一个岗位。

2、现场报名。报名者须填写《唐山海港经济开发区事业单位公开招聘工作人员报名表》,可从网上下载打印填写,并带本人有效身份证、毕业证、学位证、资格证和有关材料原件以及复印件、3张近期同底1寸免冠照片。

3、报考人员应如实提交有关信息和材料,凡本人填写信息不真实、不完整或填写错误的,责任自负。弄虚作假的,一经查实即取消考试资格或聘用资格。

4、报名与考试时使用的身份证必须一致。

5、报名公告在唐山事业单位招聘网www.tssydwzpw.com、唐山人才网www.tsrcw.com、及唐山海港人才网http://tsrcw.com/xqwz/3/index.aspx公布。

6、报名时间:2019年8月7至8日上午9:00-11:30;下午14:30-17:00。领取准考证时间为2019年8月13日上午9:00-11:30;下午14:30-17:00。

7、报名、取准考证地点:唐山海港开发区二中北门阶梯教室。

(二)开考比例。

面向社会公开招聘的岗位报考人数与招聘人数的比例不低于2:1。报名人数达不到开考比例的,取消或核减岗位招聘计划。选聘不设开考比例。

(三)公开招聘的笔试、面试总成绩为100分,各占50%。总成绩低于60分的不予录取。计算考生成绩时,保留小数点后两位。考试总成绩=笔试成绩×50%+面试成绩×50%。

1、公开招聘笔试采取闭卷的方式。笔试内容为医学专业能力测验和公共基础知识,一张卷,全部为客观题,考试时间120分钟,满分100分,由开发区招聘领导小组根据考试成绩划定合格分数线。不指定考试辅导用书和培训机构。

考试时间、地点等具体信息查看笔试准考证。参加考试时,必须同时携带笔试准考证和有效期内法定身份证件,否则不得参加考试。笔试期间不得提前离场,不得携带各类电子设备(如:手机、计算器等)。

笔试时间:2019年8月16日上午9:00-11:00。

笔试地点:唐山海港开发区二中。

2、参加公开招聘的考生,依据笔试成绩,对在最低控制分数线以上的考生,从高分到低分按招聘岗位计划数2:1的比例确定参加面试人选,末位笔试总成绩并列的都进入面试。

3、公开招聘面试方式。采取结构化面试方式进行,主要测试应聘人员的综合素质和相关能力。面试实行百分制,当场打分,面试成绩采用“体操打分”方法,去掉一个最高分和一个最低分,其他分数的平均分为面试成绩。面试满分100分,最低合格分数线60分。

面试时间:2019年8月23日。报到时间为上午7:30-8:00,超时视为放弃。

面试地点:唐山海港开发区二中。

(四)选聘只有面试,与公开招聘的面试方式一样。

(五)体检。根据考生考试总成绩,按照招聘计划按1:1比例在合格线以上人员中从高分到低分确定参加体检人选。如末位考试总成绩相同,按学历高者、笔试成绩高者、烈士子女、退役士兵的顺序确定人选。

体检参照公务员录用体检标准执行 (对身体条件有特殊要求的岗位,可执行国家规定的相关体检标准)。体检不合格的,取消拟聘人选资格,并从最低合格分数线以上报考同一岗位的人员中从高分到低分依次递补。体检费用自理。

(六)考核。体检合格的,由事业单位组织实施考察。考察拟聘用人员的政治思想表现、道德品质、业务能力、工作实绩等情况;做出“合格”或“不合格”结论。考察不合格的取消聘用资格。并从最低合格分数线以上报考同一岗位的人员中从高分到低分依次递补。

(七)公示。经考试、体检、考核确定拟聘用人选后,公示期不少于7个工作日。对公示反映有严重问题并查有实据,不符合聘用条件的取消其拟聘人选资格;对反映有严重问题但一时难以查实的,暂缓聘用,待查实并做出结论后决定是否聘用。

因公示结果影响聘用、公示期间放弃导致拟聘岗位出现空缺的,在本面试组本岗位内按总成绩由高到低依次递补。

(八)备案。对公示期满无异议的,或有反映问题但经核实不影响聘用的,由用人单位填写《河北省事业单位公开招聘工作人员审批表》、《河北省事业单位公开招聘工作人员拟聘人员名册》报市人社局备案。

(九)聘用。市人社部门审批后,办理编制、就业、流动、工资、社保等相关手续,并按有关规定签订《河北省事业单位聘用合同》。

被聘用人员按相关政策规定实行试用期,试用期一并计算在聘用合同期限内。试用期满考核合格的,予以正式聘用;不合格的,取消聘用。

(十)其他要求。

1、凡考生未在规定时间内按要求参加笔试、资格复审、面试、体检、考核、报到等情况的,均视为自动放弃应聘资格;在任何环节,发现考生不符合招聘条件,弄虚作假的,取消应聘资格,问题严重的要追究责任。

2、笔试、面试成绩,录取人员名单等招考的有关信息均在唐山人才网(http://www.tsrcw.com)和唐山海港人才网进行公示,录取人员名单公示期为7天。

联系电话:2913304、2913348

2019年7月30日

点击“阅读原文”下载附件:

唐山海港经济开发区医疗事业单位2019年公开招聘工作人员岗位条件表.xls

唐山海港经济开发区事业单位公开招聘工作人员报名表.xls

▼▼▼

滦南县有关单位

2019年公开招聘辅助工作人员公告

为缓解我县有关单位工作人员不足的问题,经县政府研究决定,拟面向社会公开招聘辅助工作人员131人,现公告如下:

一、招聘原则

坚持德才兼备,民主、公开、竞争、择优,实行公开招聘,在考试、政审的基础上择优聘用。

二、招聘方式

本次招聘采取统一招聘方式。按照制定招聘方案、发布招聘公告、报名及资格审查、招聘考试(笔试、体能测试、面试)、体检、政审、公示、聘用等步骤进行。

三、招聘单位及人数

共招聘辅助工作人员131名,其中:公安局60人、交通局综合执法大队67人、政法委综治中心4人。

(点击图片放大查看)

四、招聘条件

(一)应聘人员应具备以下基本条件:

1.遵守宪法和法律;

2.具有良好的品行和职业道德;

3.滦南县户籍;

4.具备岗位所需要的其他条件。

具体岗位、数量及条件要求详见《滦南县有关单位2019年公开招聘辅助工作人员岗位条件表》

(二)有下列情形之一的人员不得报考:

1. 曾因犯罪受过刑事处罚的、曾被开除公职的人员;

2. 有纹身及其他明显特殊标记者;

3. 现役军人;

4. 报考聘用后即构成回避关系的人员;

5. 法律、法规规定不得招聘的其他情形人员。

五、招聘程序

(一)发布公告

2019年8月2日起,通过滦南电视台和唐山人才网面向社会公开发布招聘信息。

(二)报名

1、报名。

报名时间:2019年8月5日——8月9日

上午8:30-11:00,下午2:30-5:00

报名地点:滦南县人力资源和社会保障局0143房间(滦南县崇法大街6号行政办公中心一楼)。

报名要求:报名者需填写《滦南县有关单位2019年公开招聘辅助工作人员报名登记表》,并携带本人有效身份证、户口本、毕业证、退伍证原件及复印件和4张近期同底一寸免冠照片。报考人员应如实提交有关信息和材料,凡本人填写信息不真实、不完整或填写错误的,责任自负;弄虚作假的,一经查实即取消考试资格或聘用资格。报名与考试时使用的身份证必须一致。

请考生保持报名时所留联系电话的畅通,以便通知有关事宜。

2、缴费:考生需交纳报名考试费100元。

(三)考试

1.笔试

(1)笔试方式:采取闭卷的方式,实行百分制,满分100分。

(2)笔试内容:考试内容为《公共基础知识》、《职业能力测验》,此次考试不指定考试辅导用书。

(3)准考证领取时间及地点:2019年8月15日,上午8:30--11:00,下午2:30--5:00,滦南县人社局0143房间。

(4)笔试时间及考试地点:详见笔试准考证。

2.体能测试

依据笔试成绩从高分到低分按招聘计划1:3的比例确定体能测试人选,比例内末位笔试成绩并列的都进入体能测试,本次考试体能测试项目为男1000米跑、女800米跑,体能测试时间和地点另行通知。

3. 面试

(1)按体能测试成绩由高到低按招聘计划1:2的比例确定面试人选。

(2)面试时间和地点另行通知。

(3)面试方式。采取结构化面试方式进行,主要测试应聘人员的综合素质和相关能力。面试实行百分制,当场打分,面试成绩采用“体操打分”方法,去掉一个最高分和一个最低分,其他分数的平均分为面试成绩,面试成绩合格分数线为60分,面试成绩当天公布,并于滦南县人社局张贴公布。

(3)总成绩合成。面试结束后,按笔试成绩、面试成绩两部分计算考试总成绩,满分 100分。笔试成绩、面试成绩分别占60%、40%计算考生总成绩,总成绩保留小数点后两位。

(四)体检、政审、公示

根据考生考试总成绩,按照招聘计划按1:1比例从高分到低分确定进入体检人选。如考试总成绩相同,笔试成绩高者优先,笔试成绩仍相同,以1000米跑体能测试成绩好者优先。

体检项目和标准参照《公务员录用体检标准(试行)》执行,体检费用自理。体检合格的,由用人单位对其思想政治表现、道德品质、业务能力等情况进行政审,政审须在体检结束后7日内完成。

经考试、体检、政审确定拟聘用人选后,对拟聘用人员信息进行公示,公示期不少于7日。对公示反映有严重问题并查有实据,不符合聘用条件的,取消其拟聘人选资格;对反映有严重问题,但一时难以查实的,暂缓聘用,待查实并做出结论后,决定是否聘用。

因体检或政审不合格、公示结果影响聘用、公示期间放弃,导致拟聘岗位出现空缺的,按考试总成绩从高分到低分依次递补。

(五)聘用

拟聘人员公示期满无异议的,由招聘单位与拟聘人员于7日内签订聘用合同,如拟聘人员在规定时间内放弃签订聘用合同,导致拟聘岗位出现空缺的,在报考同一岗位的考生中按考试总成绩从高分到低分依次递补。此后若再因故出现缺额,不再递补。

六、聘用人员管理及待遇

被聘用人员按聘用合同进行管理,不纳入编制。被聘用人员试用期为两个月,期满经考核合格的,正式签订为期一年的聘用合同(试用期计算在聘用期限内),聘用期间执行同类辅助工作人员工资,并按有关政策参加企业职工基本养老保险及医疗、生育、失业、工伤保险。一年聘用期满后,根据工作需要及考核情况再行续聘(年度考核不合格者,解除聘用合同),继续参加企业职工基本养老保险及医疗、生育、失业、工伤保险。

七、组织机构

本次招聘工作在县公开招聘工作领导小组统一领导下进行,具体由县人社局牵头组织实施,笔试、体能测试、面试由县公开招聘领导小组办公室委托第三方实施。相关部门密切配合,并接受纪检监察部门的监督,确保招聘工作的公开、公平、公正。

2019年8月2日

▼▼▼

玉田县关于公开补招劳务派遣交警大队警务辅助人员的公告

按照上级要投入专职警力建立治超站点、要配备专职警力增设京秦高速玉田段交通管理的要求,为确保全县经济发展提速,保障交通安全,根据交警大队警力明显不足的实际情况,经研究,拟面向社会公开补招劳务派遣交警大队警务辅助人员24人,具体补招公告如下:

一、补招岗位及名额

共补招劳务派遣交警大队警务辅助人员24人,要求男性。


二、补招条件

1.学历要求:补招对象为高中以上学历毕业生;

2.年龄要求:补招对象年龄在30周岁以下(1988年8月1日之后出生,以身份证为准)。

3.户籍要求:补招对象为玉田县户籍

4.其他要求:

(1)有良好的职业道德和敬业精神,遵纪守法,品行端正。

(2)身心健康,五官端正,无口吃,无传染病,无抑郁史及精神心理疾病。

(3)服从分配。

5.有下列情形之一者,不得报名

(1)正在接受司法或纪检监察机关立案调查的;

(2)受过司法机关刑事处罚的;

(3)曾经被开除的公职人员;

(4)全日制普通类2020年以后毕业的在读学生;

(5)现役军人;

(6)具有法律规定不得招用的其他情形的人员。

三、补招的程序和方法

本次补招工作按照发布补招公告、报名、资格审查、笔试、面试、体检、考察、公示、岗前培训等步骤进行。

(一)公告时间

面向社会发布公告,时间2019年8月1日至8月7日。

(二)报名要求

1.报名时间:2019年8月8日至8月9日,

上午8:30-11:30;下午14:30-17:30。

2.报名地点:玉田县人力资源和社会保障局人力资源市场大厅(南院一楼)。

3.报名要求:

(1)提交材料

携带本人身份证、户口本(首页及本人页)、毕业证等所有材料的复印件以及小2寸近期彩色免冠照片一张。报名人员填写劳务派遣交警大队警务辅助人员报名情况登记表(附件2,网上下载,提前填写、打印,必须本人签字)。报名人员所持证件必须真实、有效,如发现报名人员不符合报名条件或提供虚假证明的,取消考试或招用资格,后果由本人自负。

(2)费用。每人收取报名考务费100元。

(三)资格审查

根据报名人员提交的证件进行资格审查,审查合格的,审核人要签字确认,存档备查。

审查合格者,准予参加考试。资格审查贯穿于公开招用工作的全过程,考察、培训、上岗等任一环节如发现提交虚假证明、冒名顶替、不符合报名条件者,随时取消招用资格。

报考人员于2019年8月13日-14日,持本人身份证原件到县人力资源和社会保障局人力资源市场大厅(南院一楼)领取《准考证》。

(四)考试

此次补招考试由玉田县通宇劳务输出有限公司委托第三方考试机构进行。

笔试时间以准考证确定时间为准。笔试采取闭卷考试的方式进行,考试内容为《公共基础知识》和《事业单位职业能力测验》,时间为120分钟,满分100分。

如果报名人数与补招人数比例超过2:1,组织笔试,不组织面试,按笔试成绩从高到低录取;如果报名人数与补招人数比例不足2:1,不再组织笔试,直接面试,按面试成绩从高到低录取。

面试采用结构化面试,时间为5分钟,主要对应试者的仪表举止素质、语言表达能力、综合分析能力、应变与自我控制能力、人际交往合作意识和与报考职位匹配性等进行综合评价。

(五)考察

依据招用名额,按考生考试成绩从高到低确定参加考察人员名单。末位出现并列时,依次考虑学历学位高者、工作经历长者优先,以上条件均相同者由公开招用工作领导小组办公室最终确定进入考察人员名单。确定的人员由县公安局参照警务人员录用及政审条件进行考察,并出具考察合格的证明材料。对于有纹身等身体有特殊标记,不适合从事警务工作的人员考察不予通过。

(六)体检

拟补招人员需参加体检,体检项目和标准参照《公务员录用体检通用标准(试行)》执行。对考察合格人员进行体检,因考察、体检不合格出现的指标缺额,按确定考察人员名单顺序依次递补。

(七)公示

报考人员的成绩和补招结果在“玉田人才网”和“玉田县人才”微信公众平台公示。

(八)招用

经公示无异议的,确定补招为劳务派遣交警大队警务辅助人员,与玉田县通宇劳务输出有限公司签订两年以上固定期限劳动合同。劳动合同期满,经县公安局考核合格后,双方可以协商续签劳动合同。

(九)培训上岗

集中对新补招劳务派遣交警大队警务辅助人员进行岗前培训。经培训后,县公安局对补招劳务派遣交警大队警务辅助人员进行统一分配。要求补招人员在规定的期限内上岗。无故不到岗的,按自动放弃处理。

四、补招人员待遇

1.在劳动合同期内,由县公安局对劳务派遣交警大队警务辅助人员进行考核管理。考核不合格者,县公安局有权将其退回玉田县通宇劳务输出有限公司,并由通宇公司解除劳动合同。

2.劳务派遣交警大队警务辅助人员提出辞职时,需提前一个月向县公安局递呈书面申请,同时向玉田县通宇劳务输出有限公司提出解除劳动合同申请,履行相关法定手续后方可辞职。

3.劳务派遣交警大队警务辅助人员工资标准为每月1650元。除固定工资外不享受其他待遇。工资保险等费用由财政拨付到劳务派遣公司,劳务派遣公司负责发放工资、为其缴纳企业职工社会保险(养老、医疗、工伤、生育、失业),个人应缴纳部分从工资中扣除。

五、相关事宜

1.报考人员按规定参加笔试、面试、体检、考察、培训等。凡在规定时间未参加规定程序的,均视为自动放弃。

2.考试成绩和招用结果可通过 “玉田人才网”和微信公众平台“玉田人才”查询。

3.本次考试由玉田县通宇劳务输出有限公司委托第三方机构进行,

4.本次考试不指定考试辅导用书,不举办也不委托任何机构或个人举办考试辅导培训班。

六、本方案由玉田县通宇劳务输出有限公司负责解释。

登录网址

“http://www.ytrcw.net/data/upload/hrtools/19/08/01/5d42b1da2abe8.xls”下载《报名情况登记表》

▼▼▼

玉田县司关于公开招用劳务派遣退役军人管理服务人员公告

为有效解决县退役军人事务局人员紧缺问题,经研究决定,按照“公开、平等、竞争、择优”的原则,面向社会公开招用5名劳务派遣退役军人管理服务人员。具体公告如下:

一、招用岗位、数量

劳务派遣退役军人管理服务人员5名。其中男性2名,女性3名。

二、招用条件

1.具有玉田县户籍,享有公民的政治权利;

2.模范遵守国家的法律和法规,廉洁自律,为人正派,品行端正;

3.具有全日制普通类大学本科及以上学历(截止到报名之日,须取得相应毕业证书);

4.年龄在30周岁以下(1988年8月1日及以后出生,以身份证为准)。

5.有下列情形之一者,不得招用为劳务派遣人员:被判处刑罚的;正在接受司法机关立案侦查或纪检监察机关立案审查的;曾被辞退或开除公职的;有不良行为受过公安机关处理的;其他不宜从事招用岗位工作的。

三、招用的程序和方法

本次招用工作按照发布招用公告、报名、资格审查、笔试、面试、体检、考察、公示、岗前培训等步骤进行。

(一)发布招用公告

2019年8月1日--7日在“玉田人才网”以及微信公众平台“玉田人才”发布《招用公告》,公布招用的岗位、人数、条件以及报名、考试安排等。

(二)报名方法

1.报名时间:2019年8月8日--8月9日。上午8:30-11:30,下午14:30-17:30。

2.报名地点:玉田县人力资源和社会保障局人力资源市场(南院一楼)。

3.报名手续:报名人员报名时须持本人身份证、户口本(首页和本人页)、毕业证书等所有材料的原件和复印件,以及近期小2寸彩色免冠照片一张,并填写《玉田县2019年公开招用劳务派遣退役军人管理服务人员报名情况登记表》(附件2,网上下载,提前填写、打印,必须本人签字)。

4.开考比例:招用人数与岗位报考人数的比例不低于1:2。报名人数达不到开考比例的,由县公开招用工作领导小组适当核减该岗位招用人数或取消该岗位的招用。

5.报考费用:每人收取报名考务费100元。

(三)资格审查

由县公开招用工作领导小组办公室负责对报名资料统一进行审查。资格审查贯穿于公开招用工作的全过程,如发现弄虚作假行为,随时取消公开招用资格。资格审查合格者,2019年8 月 13日、 14日凭本人身份证原件到县人力资源和社会保障局人力资源市场大厅(南院一楼)领取《准考证》。

(四)素质考核

素质考核分为笔试和面试。素质考核成绩=笔试成绩*40%+面试成绩*60%。计算考生成绩时,保留小数点后两位有效数字。

1.笔试。笔试时间:具体时间地点以准考证为准。笔试内容为《公共基础知识》和《事业单位职业能力测验》。笔试采取闭卷考试方式,答题时间120分钟,满分100分。

笔试成绩和进入面试人员名单可登陆“玉田人才网”或微信公众号“玉田人社”和“玉田人才”进行查询。

2.面试。面试时间另行安排。

根据笔试成绩,按照招用人数与进入面试人数1:2的比例,从高分到低分确定参加面试人员(末位并列的都进入面试)。

面试每人8分钟,满分100分。主要对应试者的仪表举止素质、语言表达能力、综合分析能力、应变与自我控制能力、人际交往合作意识和与报考职位匹配性等进行综合评价。

面试采用结构化面试方式进行。采用“体操打分”方法,去掉一个最高分和一个最低分,其余所得分数的平均分为面试成绩。面试成绩当天在面试考点张贴。

(五)体检

时间另行安排。根据素质考核成绩,按照招用人数与参加体检人数1:1的比例,从高分到低分确定参加体检人员(末位并列的,面试成绩高者优先;面试成绩再相同者,由县公开招用工作领导小组综合考虑应试者的学历、年龄等因素确定参加体检人员)。体检项目和标准参照《公务员录用体检通用标准(试行)》的有关规定执行。因体检不合格出现的职位空缺按素质考核成绩依次递补。

(六)考察

时间另行安排。由县公开招用工作领导小组办公室负责对体检合格人员进行考察。重点了解被考察对象的思想政治表现、道德品质、业务能力、拟任岗位资格条件等。因不合格者出现的人员缺额,参照确定体检人员的办法依次递补考察对象。

(七)公示

报考人员的素质考核成绩和拟招用人员名单在“玉田人才网”和微信公众平台“玉田人才”进行公示。

(八)岗前培训

招用对象正式上岗前,由县退役军人事务局组织岗前培训。

四、招用人员待遇

招用人员试用期一年,与劳务派遣公司签订劳动合同。试用期满,由县退役军人事务局负责考核。考核不合格的退回劳务派遣公司并解除劳动合同;考核合格者,与劳务派遣公司签订正式劳动合同。

招用人员执行事业单位同类人员工资标准。各项费用由县财政局拨付到劳务派遣公司,劳务派遣公司负责发放工资,为其缴纳养老、医疗、工伤、生育、失业等各项保险和住房公积金。

五、相关事宜

(一)报名人员应携带相关证件,提前下载并填写《玉田县公开招用劳务派遣退役军人管理服务人员报名情况登记表》。因表格填写有误影响报考和聘用的,后果自负。报名结束后要密切关注“玉田人才网”以及微信公众号“玉田人才”。有关公开招用的重要信息,均通过“网站”和“公众号”公布,不再另行通知。

(二)应聘人员在招用期间务必保持通信畅通。凡未在规定时间内报名、领取《准考证》、参加笔试、面试、体检、岗前培训等规定程序的,均视为自动放弃。

(三)应聘人员必须持身份证和准考证参加笔试、面试,两证不全的不得参考。

(四)被招用人员要在县通宇劳务输出有限公司规定的期限内到县退役军人事务局报到,逾期三天不报到者,取消招用资格,所缺名额按应聘人员素质考核成绩依次递补。

(五)本次考试由玉田县通宇劳务输出有限公司委托第三方机构进行,包括命题、印刷、监场、阅卷、登统等环节。全权负责公开招用的笔试、面试等工作。

(六)本次考试不指定考试辅导用书,不举办也不委托任何机构或个人举办考试辅导培训班。对于公告规定的时间,如有变动另行通知。

有关公开招用的具体事宜由玉田县通宇劳务输出有限公司负责解释。

登录网址

“https://mp.weixinbridge.com/mp/wapredirect?url=http%3A%2F%2Fwww.ytrcw.net%2Fdata%2Fupload%2Fhrtools%2F19%2F08%2F01%2F5d42b1a158adc.xls”下载报名情况登记表


- END -

唐山发布(tangshanpress)

综合整理出品|转载请注明来源

来源 | 唐山人才网 玉田人社

以上图片版权均归作者所有

源 | https://www.jianshu.com/p/e161bd720e64


国外某网站给出了44道JS难题,试着做了下,只做对了17道。这些题涉及面非常广,涵盖JS原型、函数细节、强制转换、闭包等知识,而且都是非常细节的东西,透过这些小细节可以折射出很多高级的JS知识点。

你可以通过传送门(http://javascript-puzzlers.herokuapp.com/)先去测试一下你的水平,然后回来看看我的解析。为了详细解释这些细节,我也查阅了不少资料,弥补了很多JS知识盲点。

1. parseInt 遇上 map

["1", "2", "3"].map(parseInt)


// A. ["1", "2", "3"]
// B. [1, 2, 3]
// C. [0, 1, 2]
// D. other

答案是D。实际上返回的结果是 [1, NaN, NaN] ,因为 parseInt 函数只需要两个参数 parseInt(value, radix) ,而 map 的回调函数需要三个参数 callback(currentValue, index, array)。

MDN文档中指明 parseInt 第二个参数是一个2到36之间的整数值,用于指定转换中采用的基数。如果省略该参数或其值为0,则数字将以10为基础来解析。

如果该参数小于2或者大于36,则 parseInt 返回 NaN。此外,转换失败也会返回 NaN。

现在来分析问题。parseInt("1", 0) 的结果是当作十进制来解析,返回 1;parseInt("2", 1) 的第二个参数非法,返回 NaN;parseInt("3", 2) 在二进制中,"3" 是非法字符,转换失败,返回 NaN。

参考资料:

  • MDN: Array.prototype.map()
  • MDN: parseInt

2. 神奇的null

[typeof null, null instanceof Object]


// A. ["object", false]
// B. [null, false]
// C. ["object", true]
// D. other

答案是A。在MDN关于 null 的文档中也特别指出来了,typeof null 的结果是 "object",它是ECMAScript的bug,其实应该是 "null"。但这个bug由来已久,在JavaScript中已经存在了将近二十年,也许永远不会修复,因为这牵扯到太多的Web系统,修复它会产生更多的bug,令许多系统无法正常工作。而 instanceof 运算符是用来测试一个对象在其原型链构造函数上是否具有 prototype 属性,null 值并不是以 Object 原型创建出来的,所以 null instanceof Object 返回 false。

参考资料:

  • MDN:null
  • MDN:instanceof
  • CSDN博客:null instanceof Object 求解?

3. 愤怒的reduce

[ [3,2,1].reduce(Math.pow), [].reduce(Math.pow) ]


// A. an error
// B. [9, 0]
// C. [9, NaN]
// D. [9, undefined]

答案是A。MDN文档中关于 Array.prototype.reduce() 写得很清楚:

如果数组为空并且没有提供initialValue, 会抛出TypeError 。如果数组仅有一个元素(无论位置如何)并且没有提供initialValue, 或者有提供initialValue但是数组为空,那么此唯一值将被返回并且callback不会被执行。

参考资料:

  • MDN:Array.prototype.reduce()

4. 该死的优先级

var val = 'smtg';
console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing');


// A. Value is Something
// B. Value is Nothing
// C. NaN
// D. other

答案是D。实际上输出 "Something",因为 + 的优先级比条件运算符 condition ? val1 : val2 的优先级高。

参考资料:

  • MDN:运算符优先级

5. 神鬼莫测之变量提升

var name = 'World!';
(function () {
    if (typeof name === 'undefined') {
      var name = 'Jack';
      console.log('Goodbye ' + name);
    } else {
      console.log('Hello ' + name);
    }
})();


// A. Goodbye Jack
// B. Hello Jack
// C. Hello undefined
// D. Hello World

答案是A。看如下MDN官方文档的解释:

在 JavaScript中, functions 和 variables 会被提升。变量提升是JavaScript将声明移至作用域 scope (全局域或者当前函数作用域) 顶部的行为。

这意味着你可以在声明一个函数或变量之前引用它,或者可以说:一个变量或函数可以在它被引用之后声明。

所以,上面的代码与下面这段代码是等价的:

var name = 'World!';
(function () {
    var name;
    if (typeof name === 'undefined') {
      name = 'Jack';
      console.log('Goodbye ' + name);
    } else {
      console.log('Hello ' + name);
    }
})();

参考资料:

  • MDN:变量提升
  • 这篇博客解释的比较详细:js变量提升

6. 死循环陷阱

var END = Math.pow(2, 53);
var START = END - 100;
var count = 0;
for (var i = START; i <= END; i++) { 
  count++;
}
console.log(count);


// A. 0
// B. 100
// C. 101
// D. other

答案是D。在JavaScript中,2^53 是最大的值,没有比这更大的值了。所以 2^53 + 1 == 2^53,所以这个循环无法终止。

7. 过滤器魔法

var ary = [0,1,2];
ary[10] = 10;
ary.filter(function(x) {
  return x === undefined;
});


// A. [undefined x 7]
// B. [0, 1, 2, 10]
// C. []
// D. [undefined]

答案是C。看MDN官方文档的描述:

filter 为数组中的每个元素调用一次 callback 函数,并利用所有使得 callback 返回 true 或 等价于 true 的值 的元素创建一个新数组。callback 只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callback 测试的元素会被跳过,不会被包含在新数组中。

参考资料:

  • MDN:Array.prototype.filter()

8. 警惕IEEE 754标准

var two = 0.2;
var one = 0.1;
var eight = 0.8;
var six = 0.6;
[two - one == one, eight - six == two]


// A. [true, false]
// B. [false, false]
// C. [true, false]
// D. other

答案是C。JavaScript中采用双精度浮点数格式,即IEEE 754标准。在该格式下,有些数字无法表示出来,比如:0.1 + 0.2 = 0.30000000000000004 ,这不是JavaScript的锅,所有采用该标准的语言都有这个问题,比如:Java、Python等。

参考资料:

  • Wiki:Double-precision floating-point format

9. 字符串陷阱

function showCase(value) {
  switch(value) {
    case 'A':
      console.log('Case A');
      break;
    case 'B':
      console.log('Case B');
      break;
    case undefined:
      console.log('undefined');
      break;
    default:
      console.log('Do not know!');
  }
}
showCase(new String('A'));


// A. Case A
// B. Case B
// C. Do not know!
// D. undefined

答案是C。在 switch 内部使用严格相等 === 进行判断,并且 new String("A") 返回的是一个对象,而 String("A") 则是直接返回字符串 "A"。你也可以参考MDN中对原始字符串和String对象的区分:

Note that JavaScript distinguishes between String objects and primitive string values. (The same is true of Boolean and Numbers.)

String literals (denoted by double or single quotes) and strings returned from String calls in a non-constructor context (i.e., without using the new keyword) are primitive strings. JavaScript automatically converts primitives to String objects, so that it's possible to use String object methods for primitive strings. In contexts where a method is to be invoked on a primitive string or a property lookup occurs, JavaScript will automatically wrap the string primitive and call the method or perform the property lookup.

参考资料:

  • MDN:String

10. 再一次的字符串陷阱

function showCase(value) {
  switch(value) {
    case 'A':
      console.log('Case A');
      break;
    case 'B':
      console.log('Case B');
      break;
    case undefined:
      console.log('undefined');
      break;
    default:
      console.log('Do not know!');
  }
}
showCase(String('A'));


// A. Case A
// B. Case B
// C. Do not know!
// D. undefined

答案显然是A。与上面唯一不同的是没有使用 new 关键字,所以直接返回字符串,实际上,typeof string("A") === "string" 的结果是 true。解释参见第9条的解释。

11. 并非都是奇偶

function isOdd(num) {
  return num % 2 == 1;
}


function isEven(num) {
  return num % 2 == 0;
}


function isSane(num) {
  return isEven(num) || isOdd(num);
}


var values = [7, 4, "13", -9, Infinity];
values.map(isSane);


// A. [true, true, true, true, true]
// B. [true, true, true, true, false]
// C. [true, true, true, false, false]
// D. [true, true, false, false, false]

答案是C。-9 % 2 = -1 以及 Infinity % 2 = NaN,求余运算符会保留符号,所以只有 isEven 的判断是可靠的。

12. parseInt小贼

parseInt(3, 8);
parseInt(3, 2);
parseInt(3, 0);


// A. 3, 3, 3
// B. 3, 3, NaN
// C. 3, NaN, NaN
// D. other

答案是D。实际结果是 3, NaN, 3,这个在第一个问题中解释的很清楚了。

13. 数组原型是数组

Array.isArray( Array.prototype )


// A. true
// B. false
// C. error
// D. other

答案是A。一个鲜为人知的事实:其实 Array.prototype 也是一个数组。这点在MDN文档中提到过。

参考资料:

  • MDN:Array.isArray()

14. 一言难尽的强制转换

var a = [0];
if ([0]) {
  console.log(a == true);
} else {
  console.log("wut");
}


// A. true
// B. false
// C. "wut"
// D. other

答案是B。这个是JavaScript中强制转换的经典案例,关于强制转换不是一两句话可以跟你说清楚的,我建议你系统性的学习一下,推荐你看看《你不知道的JavaScript-中卷》这本书,如果不舍得买书,github上有英文原版:You-Dont-Know-JS,深入理解之后你就是高手了。

好了,回到当前这个问题。当 [0] 需要被强制转成 Boolean 的时候会被认为是 true。所以进入第一个 if 语句,而 a == true 的转换规则在ES5规范的第11.9.3节中已经定义过,你可以自己详细探索下。

规范指出,== 相等中,如果有一个操作数是布尔类型,会先把他转成数字,所以比较变成了 [0] == 1;同时规范指出如果其他类型和数字比较,会尝试把这个类型转成数字再进行宽松比较,而对象(数组也是对象)会先调用它的 toString() 方法,此时 [0] 会变成 "0",然后将字符串 "0" 转成数字 0,而 0 == 1 的结果显然是 false。

参考资料:

  • ES5规范:11.9.3
  • 《你不知道的JavaScript-中卷》

15. 撒旦之子“==”

[]==[]


// A. true
// B. false
// C. error
// D. other

答案是B。ES5规范11.9.3.1-f指出:如果比较的两个对象指向的是同一个对象,就返回 true,否则就返回 false,显然,这是两个不同的数组对象。

参考资料:

  • ES5规范:11.9.3.1
  • 《你不知道的JavaScript-中卷》

16. 加号 VS 减号

'5' + 3;
'5' - 3;


// A. "53", 2
// B. 8, 2
// C. error
// D. other

答案是A。"5" + 2 = "52" 很好理解,+ 运算符中只要有一个是字符串,就会变成字符串拼接操作。你不知道的是,- 运算符要求两个操作数都是数字,如果不是,会强制转换成数字,所以结果就变成了 5 - 2 = 3。

参考资料:

  • 《你不知道的JavaScript-中卷》,第四章:4.4.2 字符串和数字之间的隐式强制类型转换

17. 打死那个疯子

1 + - + + + - + 1


// A. 2
// B. 1
// C. error
// D. other

答案是A。这个只能出现在示例代码中,如果你发现哪个疯子写了这个在生产代码中,打死他就行了。你只要知道 + 1 = 1和- 1 = -1,注意符号之间的空格。两个减号抵消,所以最终结果等效于 1 + 1 = 2。或者你也可以在符号之间插入 0 来理解,即 1 + 0 - 0 + 0 + 0 + 0 - 0 + 1,这样你就一目了然了吧!千万别写这样的代码,因为可能会被打死!

18. 淘气的map

var ary = Array(3);
ary[0] = 2;
ary.map(function(elem) {
  return "1";
});


// A. [2, 1, 1]
// B. ["1", "1", "1"]
// C. [2, "1", "1"]
// D. other

答案是D。实际上结果是 ["1", undefined x 2],因为规范写得很清楚:

map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数。callback 每次执行后的返回值组合起来形成一个新数组。callback 函数只会在有值的索引上被调用;那些从来没被赋过值或者使用 delete 删除的索引则不会被调用。

参考资料:

  • MDN: Array.prototype.map()

19. 统统算我的

function sidEffecting(ary) {
  ary[0] = ary[2];
}


function bar(a, b, c) {
  c = 10;
  sidEffecting(arguments);
  return a + b + c;
}


bar(1, 1, 1);


// A. 3
// B. 12
// C. error
// D. other

答案是D。实际上结果是 21。在JavaScript中,参数变量和 arguments 是双向绑定的。改变参数变量,arguments 中的值会立即改变;而改变 arguments 中的值,参数变量也会对应改变。

20. 损失精度的IEEE 754

var a = 111111111111111110000;
var b = 1111;
console.log(a + b);


// A. 111111111111111111111
// B. 111111111111111110000
// C. NaN
// D. Infinity

答案是B。这是IEEE 754规范的黑锅,不是JavaScript的问题。表示这么大的数占用过多位数,会丢失精度,学过计算机组成原理的应该知道是怎么回事。

参考资料:

  • Wiki:Double-precision floating-point format

21. 反转世界

var x = [].reverse;
x();


// A. []
// B. undefined
// C. error
// D. window

答案是D。MDN规范关于 reverse 的描述:

reverse 方法颠倒数组中元素的位置,并返回该数组的引用。

而这里调用的时候没有制定数组,所以默认的 this 就是 window,所以最后结果返回的是 window。

参考资料:

  • MDN:Array.prototype.reverse()

22. 最小的正值

Number.MIN_VALUE > 0


// A. false
// B. true
// C. error
// D. other

答案是B。看规范描述吧:

MIN_VALUE属性是 JavaScript 里最接近 0 的正值,而不是最小的负值。

MIN_VALUE的值约为 5e-324。小于 MIN_VALUE
("underflow values") 的值将会转换为 0。

因为 MIN_VALUE是 Number 的一个静态属性,因此应该直接使用:Number.MIN_VALUE,而不是作为一个创建的 Number实例的属性。

参考资料:

  • MDN:Number.MIN_VALUE

23. 谨记优先级

[1 < 2 < 3, 3 < 2 < 1]


// A. [true, true]
// B. [true, false]
// C. error
// D. other

答案是A。<和>的优先级都是从左到右,所以 1 < 2 < 3 会先比较 1 < 2,这会得到 true,但是 < 要求比较的两边都是数字,所以会发生隐式强制转换,将 true 转换成 1,所以最后就变成了比较 1 < 3,结果显然为 true。同理可以分析后者。

参考资料:

  • MDN:运算符优先级

24. 坑爹中的战斗机

// the most classic wtf
2 == [[[2]]]


// A. true
// B. false
// C. undefined
// D. other

答案是A。根据ES5规范,如果比较的两个值中有一个是数字类型,就会尝试将另外一个值强制转换成数字,再进行比较。而数组强制转换成数字的过程会先调用它的 toString方法转成字符串,然后再转成数字。所以 [2]会被转成 "2",然后递归调用,最终 [[[2]]] 会被转成数字 2。

25. 小数点魔术

3.toString();
3..toString();
3...toString();


// A. "3", error, error
// B. "3", "3.0", error
// C. error, "3", error
// D. other

答案是C。点运算符会被优先识别为数字常量的一部分,然后才是对象属性访问符。所以 3.toString() 实际上被JS引擎解析成 (3.)toString(),显然会出现语法错误。但是如果你这么写 (3).toString(),人为加上括号,这就是合法的。

26. 自动提升为全局变量

(function() {
  var x = y = 1;
})();
console.log(y);
console.log(x);


// A. 1, 1
// B. error, error
// C. 1, error
// D. other

答案是C。很经典的例子,在函数中没有用 var 声明变量 y,所以 y 会被自动创建在全局变量 window下面,所以在函数外面也可以访问得到。而 x 由于被 var 声明过,所以在函数外部是无法访问的。

27. 正则表达式实例

var a = /123/;
var b = /123/;
a == b;
a === b;


// A. true, true
// B. true, false
// C. false, false
// D. other

答案是C。每个字面的正则表达式都是一个单独的实例,即使它们的内容相同。

28. 数组也爱比大小

var a = [1, 2, 3];
var b = [1, 2, 3];
var c = [1, 2, 4];


a == b;
a === b;
a > c;
a < c;


// A. false, false, false, true
// B. false, false, false, false
// C. true, true, false, true
// D. other

答案是A。数组也是对象,ES5规范指出如果两个对象进行相等比较,只有在它们指向同一个对象的情况下才会返回 true,其他情况都返回 false。而对象进行大小比较,会调用 toString 方法转成字符串进行比较,所以结果就变成了字符串 "1,2,3" 和 "1,2,4" 按照字典序进行比较了(你若不信,可以重现两个变量的 toString 方法,进行测试)。

29. 原型把戏

var a = {};
var b = Object.prototype;


[a.prototype === b, Object.getPrototypeOf(a) == b]


// A. [false, true]
// B. [true, true]
// C. [false, false]
// D. other

答案是A。对象是没有 prototype 属性的,所以 a.prototype 是 undefined,但我们可以通过 Object.getPrototypeOf 方法来获取一个对象的原型。

30. 构造函数的函数

function f() {}
var a = f.prototype;
var b = Object.getPrototypeOf(f);
a === b;


// A. true
// B. false
// C. null
// D. other

答案是B。这个解释起来有点绕口,我们先来看另外一段代码:

function Person() {}
var p = new Person();


var a = p.__proto__;
var b = Object.getPrototypeOf(p);
var c = Person.prototype;
console.log(a === b, a === c, b === c);
// true, true, true


var d = Person.__proto__;
var e = Object.getPrototypeOf(Person);
var f = Function.prototype;
console.log(d === e, d === f, e === f);
// true, true, true

首先你要明白,任何函数都是 Function 的实例,而p是函数 Person 的实例,Object.getPrototypeOf 会获取构造当前对象的原型。所以 Object.getPrototypeOf(p) === Person.prototype,而 Object.getPrototypeOf(Person) === Function.prototype,所以答案就很明显了。

我解释的不是很好,如果读者有更好的解释,欢迎评论。

31. 禁止修改函数名

function foo() {}
var oldName = foo.name;
foo.name = "bar";
[oldName, foo.name];


// A. error
// B. ["", ""]
// C. ["foo", "foo"]
// D. ["foo", "bar"]

答案是C。函数名是禁止修改的,规范写的很清楚,所以这里的修改无效。

参考资料:

  • MDN:Function.name

32. 替换陷阱

"1 2 3".replace(/\d/g, parseInt);


// A. "1 2 3"
// B. "0 1 2"
// C. "NaN 2 3"
// D. "1 NaN 3"

答案是D。如果 replace 方法第二个参数是一个函数,则会在匹配的时候多次调用,第一个参数是匹配的字符串,第二个参数是匹配字符串的下标。所以变成了调用 parseInt(1, 0)、parseInt(2, 2)和parseInt(3, 4),结果你就懂了。

参考资料:

  • MDN:String.prototype.replace()

33. Function的名字

function f() {}
var parent = Object.getPrototypeOf(f);
console.log(f.name);
console.log(parent.name);
console.log(typeof eval(f.name));
console.log(typeof eval(parent.name));


// A. "f", "Empty", "function", "function"
// B. "f", undefined, "function", error
// C. "f", "Empty", "function", error
// D. other

答案是C。根据第30题的解释,我们知道代码中的 parent 实际上就是 Function.prototype,而它在控制台中输出为:

function () {
  [native code]
}

它的 name 属性是 "",所以你 eval("")是得不到任何东西的。

34. 正则测试陷阱

var lowerCaseOnly = /^[a-z]+$/;
[lowerCaseOnly.test(null), lowerCaseOnly.test()]


// A. [true, false]
// B. error
// C. [true, true]
// D. [false, true]

答案是C。test 方法的参数如果不是字符串,会经过抽象 ToString操作强制转成字符串,因此实际上测试的是字符串 "null" 和 "undefined"。

35. 逗号定义数组

[,,,].join(", ")


// A. ", , , "
// B. "undefined, undefined, undefined, undefined"
// C. ", , "
// D. ""

答案是C。JavaScript允许用逗号来定义数组,得到的数组是含有3个 undefined 值的数组。MDN关于 join 方法的描述:

所有的数组元素被转换成字符串,再用一个分隔符将这些字符串连接起来。如果元素是undefined 或者null, 则会转化成空字符串。

参考资料:

  • MDN:Array.prototype.join()

36. 保留字 class

var a = {class: "Animal", name: "Fido"};
console.log(a.class);


// A. "Animal"
// B. Object
// C. an error
// D. other

答案是D。实际上真正的答案取决于浏览器。class 是保留字,但是在Chrome、Firefox和Opera中可以作为属性名称,在IE中是禁止的。另一方面,其实所有浏览器基本接受大部分的关键字(如:int、private、throws等)作为变量名,而class是禁止的。

37. 无效日期

var a = new Date("epoch");


// A. Thu Jan 01 1970 01:00:00 GMT+0100(CET)
// B. current time
// C. error
// D. other

答案是D。实际结果是 Invalid Date,它实际上是一个Date对象,因为 a instance Date 的结果是 true,但是它是无效的Date。Date对象内部是用一个数字来存储时间的,在这个例子中,这个数字是 NaN。

38. 神鬼莫测的函数长度

var a = Function.length;
var b = new Function().length;
console.log(a === b);


// A. true
// B. false
// C. error
// D. other

答案是B。实际上a的值是1,b的值是0。还是继续来看MDN文档关于 Function.length 的描述吧!

Function构造器的属性:

Function 构造器本身也是个Function。他的 length 属性值为 1 。该属性 Writable: false, Enumerable: false, Configurable: true。

Function原型对象的属性:

Function原型对象的 length 属性值为 0 。

所以,在本例中,a代表的是 Function 构造器的 length 属性,而b代表的是 Function 原型的 length 属性。

参考资料:

  • MDN:Function.length

39. Date的面具

var a = Date(0);
var b = new Date(0);
var c = new Date();
[a === b, b === c, a === c];


// A. [true, true, true]
// B. [false, false, false]
// C. [false, true, false]
// D. [true, false, false]

答案是B。先看MDN关于Date对象的注意点:

需要注意的是只能通过调用 Date 构造函数来实例化日期对象:以常规函数调用它(即不加 new 操作符)将会返回一个字符串,而不是一个日期对象。另外,不像其他JavaScript 类型,Date 对象没有字面量格式。

所以a是字符串,b和c是Date对象,并且b代表的是1970年那个初始化时间,而c代表的是当前时间。

参考资料:

  • MDN:Date

40. min与max共舞

var min = Math.min();
var max = Math.max();
console.log(min < max);


// A. true
// B. false
// C. error
// D. other

答案是B。看MDN文档,对 Math.min的描述:

如果没有参数,结果为Infinity。

对 Math.max 的描述:

如果没有参数,结果为-Infinity。

参考资料:

  • MDN:Math.min
  • MDN:Math.max

41. 警惕全局匹配

function captureOne(re, str) {
  var match = re.exec(str);
  return match && match[1];
}


var numRe = /num=(\d+)/ig,
      wordRe = /word=(\w+)/i,
      a1 = captureOne(numRe, "num=1"),
      a2 = captureOne(wordRe, "word=1"),
      a3 = captureOne(numRe, "NUM=1"),
      a4 = captureOne(wordRe, "WORD=1");


[a1 === a2, a3 === a4]


// A. [true, true]
// B. [false, false]
// C. [true, false]
// D. [false, true]

答案是C。看MDN关于 exec 方法的描述:

当正则表达式使用 "g" 标志时,可以多次执行 exec 方法来查找同一个字符串中的成功匹配。当你这样做时,查找将从正则表达式的 lastIndex 属性指定的位置开始。

所以a3的值为 null。

参考资料:

  • MDN:RegExp.prototype.exec()

42. 最熟悉的陌生人

var a = new Date("2014-03-19");
var b = new Date(2014, 03, 19);
[a.getDay() == b.getDay(), a.getMonth() == b.getMonth()]


// A. [true, true]
// B. [true, false]
// C. [false, true]
// D. [false, false]

答案是D。先看MDN关于Date的一个注意事项:

当Date作为构造函数调用并传入多个参数时,如果数值大于合理范围时(如月份为13或者分钟数为70),相邻的数值会被调整。比如 new Date(2013, 13, 1)等于new Date(2014, 1, 1),它们都表示日期2014-02-01(注意月份是从0开始的)。其他数值也是类似,new Date(2013, 2, 1, 0, 70)等于new Date(2013, 2, 1, 1, 10),都表示时间2013-03-01T01:10:00。

此外,getDay 返回指定日期对象的星期中的第几天(0~6),所以,你懂的。

参考资料:

  • MDN:Date

43. 匹配隐式转换

if("http://giftwrapped.com/picture.jpg".match(".gif")) {
  console.log("a gif file");
} else {
  console.log("not a gif file");
}


// A. "a gif file"
// B. "not a gif file"
// C. error
// D. other

答案是A。看MDN对 match 方法的描述:

如果传入一个非正则表达式对象,则会隐式地使用 new RegExp(obj)
将其转换为正则表达式对象。

所以我们的字符串 ".gif" 会被转换成正则对象 /.gif/,会匹配到 "/gif"。

参考资料:

  • MDN:String.prototype.match()

44. 重复声明变量

function foo(a) {
  var a;
  return a;
}


function bar(a) {
  var a = "bye";
  return a;
}


[foo("hello"), bar("hello")]


// A. ["hello", "hello"]
// B. ["hello", "bye"]
// C. ["bye", "bye"]
// D. other

答案是B。一个变量在同一作用域中已经声明过,会自动移除 var 声明,但是赋值操作依旧保留,结合前面提到的变量提升机制,你就明白了。