Repository: xugy0926/getting-started-with-javascript Branch: master Commit: 5eb1b97442ba Files: 684 Total size: 1.2 MB Directory structure: gitextract_7orgddh0/ ├── .gitignore ├── README.md ├── _config.yml ├── homework/ │ ├── lesson1/ │ │ ├── Autumn.md │ │ ├── ElizabethZhouli.md │ │ ├── GaoXianfeng.md │ │ ├── Huang_Biling.md │ │ ├── Jaykey.md │ │ ├── Learner-Chen.md │ │ ├── LiaoYuemin.md │ │ ├── Liuzhengchun.md │ │ ├── Rachel.md │ │ ├── Risexie.md │ │ ├── SunBo.md │ │ ├── WangChangQing.md │ │ ├── Wei.md │ │ ├── WuGaoxing.md │ │ ├── XGunn-lesson01.md │ │ ├── ZhengChao.md │ │ ├── anjiancai.md │ │ ├── baoguoqiang.md │ │ ├── caijinpeng.md │ │ ├── caozhen.md │ │ ├── chaigaoping.md │ │ ├── chengjun.md │ │ ├── chenlingmin.md │ │ ├── chenqiong.md │ │ ├── chenrushan.md │ │ ├── chenyanxing.md │ │ ├── chenzidong.md │ │ ├── chenziwen.md │ │ ├── cloudyview.md │ │ ├── cuimeng.md │ │ ├── cuimiao.md │ │ ├── dangfeipeng.md │ │ ├── dengxy0907.md │ │ ├── diaozhicong.md │ │ ├── donglili.md │ │ ├── duhongxia.md │ │ ├── fangqingyang.md │ │ ├── fanliao.md │ │ ├── fanqing.md │ │ ├── feixiguang.md │ │ ├── fengkai.md │ │ ├── hanmeng.md │ │ ├── hanwei.md │ │ ├── haohu.md │ │ ├── hewei.md │ │ ├── huangjiashu.md │ │ ├── huangqi.md │ │ ├── huangxiaohui.md │ │ ├── huangzhihua.md │ │ ├── huxiaodan.md │ │ ├── huyong.md │ │ ├── ianyang.md │ │ ├── jaychen.md │ │ ├── jianglin.md │ │ ├── langjianjun.md │ │ ├── leizhen.md │ │ ├── lichen.md │ │ ├── linchunlong.md │ │ ├── lingxiao.md │ │ ├── linxiyao.md │ │ ├── lipeng.md │ │ ├── lipengyu.md │ │ ├── litao.md │ │ ├── liujuanjuan1984.md │ │ ├── liujun-sh.md │ │ ├── liujun.md │ │ ├── liuliyuan.md │ │ ├── liuqing.md │ │ ├── liuruyong.md │ │ ├── liushengsi.md │ │ ├── liushengxin.md │ │ ├── liuxiaohaohao.md │ │ ├── lixiang.md │ │ ├── lixiaoxin.md │ │ ├── liyihang.md │ │ ├── luoruijun.md │ │ ├── maggiewong.md │ │ ├── panqi.md │ │ ├── panyong.md │ │ ├── qiujingyu.md │ │ ├── shaozhen.md │ │ ├── shenzhili.md │ │ ├── sophieQi.md │ │ ├── sunxl.md │ │ ├── tangjianfeng.md │ │ ├── taobao.md │ │ ├── tuyilang.md │ │ ├── wangmeiling.md │ │ ├── wangshasha.md │ │ ├── wangwei.md │ │ ├── wangxuanding.md │ │ ├── wangyuliang.md │ │ ├── wangyunfei.md │ │ ├── wangzhongbin.md │ │ ├── wenliuxin.md │ │ ├── wenyunxin.md │ │ ├── wufan.md │ │ ├── wukuipin.md │ │ ├── xianengqi.md │ │ ├── xiaochaoge.md │ │ ├── xieyuhui.md │ │ ├── xiongliyu.md │ │ ├── xugang.md │ │ ├── xugaoyang.md │ │ ├── xuli.md │ │ ├── xuluchun.md │ │ ├── xumin.md │ │ ├── yammy.md │ │ ├── yangchunguang.md │ │ ├── yanglovewo.md │ │ ├── yangtieming.md │ │ ├── yangxuewu.md │ │ ├── yangyepeng.md │ │ ├── yanqingmu.md │ │ ├── yimiao.md │ │ ├── yongfei.md │ │ ├── youshilei.md │ │ ├── yueruiqi.md │ │ ├── yujianke.md │ │ ├── zhanggaoyang.md │ │ ├── zhanghuanyuan.md │ │ ├── zhanghy.md │ │ ├── zhanglina.md │ │ ├── zhangqian.md │ │ ├── zhangruirui.md │ │ ├── zhangxuedong.md │ │ ├── zhaokaili.md │ │ ├── zhaoxiaoxin.md │ │ ├── zhaoyinan.md │ │ ├── zhouhong.md │ │ ├── zhouqizhou.md │ │ ├── zhouziqi.md │ │ ├── zhuningning.md │ │ ├── zhuting.md │ │ ├── zhuxiaoping.md │ │ └── zhuyongjin.md │ ├── lesson2/ │ │ ├── Autumnchou.md │ │ ├── GaoXianfeng.md │ │ ├── JayChen.md │ │ ├── Jaykey_Guo.md │ │ ├── LiaoYuemin.md │ │ ├── Liuzhengchun.md │ │ ├── Rachel.md │ │ ├── Risexie.md │ │ ├── SunBo.md │ │ ├── WANG XUANDING.md │ │ ├── WangChangQing.md │ │ ├── WuGaoxing.md │ │ ├── Zhengchao.md │ │ ├── baoguoqiang.md │ │ ├── caozhen.md │ │ ├── chengjun.md │ │ ├── chenguoqiang.md │ │ ├── chenqiong.md │ │ ├── chenrushan.md │ │ ├── chenziwen.md │ │ ├── cloudyview.md │ │ ├── cuimiao.md │ │ ├── dangfeipeng.md │ │ ├── dengxy0907.md │ │ ├── diaozhicong.md │ │ ├── duhongxia.md │ │ ├── fangqingyang.md │ │ ├── fanqing.md │ │ ├── fengkai.md │ │ ├── guowei.md │ │ ├── hanmeng.md │ │ ├── hanwei.md │ │ ├── haohu.md │ │ ├── hewei.md │ │ ├── huangjiashu.md │ │ ├── huangqi.md │ │ ├── huangzhihua.md │ │ ├── huyong.md │ │ ├── jianglin.md │ │ ├── langjianjun.md │ │ ├── leizhen.md │ │ ├── lichen.md │ │ ├── lingxiao.md │ │ ├── linxiyao.md │ │ ├── lipeng.md │ │ ├── litao.md │ │ ├── liujuanjuan.md │ │ ├── liujun.md │ │ ├── liuliyuan.md │ │ ├── liuqing.md │ │ ├── liuruyong.md │ │ ├── liushengsi.md │ │ ├── liushengxin.md │ │ ├── liuxiaohaohao.md │ │ ├── lixiang.md │ │ ├── liyihang.md │ │ ├── luoruijun.md │ │ ├── marshalcy.md │ │ ├── panqi.md │ │ ├── panyong.md │ │ ├── qiujingyu.md │ │ ├── shaozhen.md │ │ ├── shenzhili.md │ │ ├── sophieQi.md │ │ ├── tangjianfeng.md │ │ ├── taobao.md │ │ ├── tuyilang.md │ │ ├── wangshasha.md │ │ ├── wangwei.md │ │ ├── wangying.md │ │ ├── wangyunfei.md │ │ ├── wangzhongbin.md │ │ ├── wenliuxin.md │ │ ├── wenyunxin.md │ │ ├── wufan.md │ │ ├── wukuipin.md │ │ ├── xianengqi.md │ │ ├── xiongliyu.md │ │ ├── xugaoyang.md │ │ ├── xuli.md │ │ ├── xuluchun.md │ │ ├── xumin.md │ │ ├── yammy.md │ │ ├── yangtieming.md │ │ ├── yangxuewu.md │ │ ├── yangyepeng.md │ │ ├── yanqingmu.md │ │ ├── yimiao.md │ │ ├── yongfei.md │ │ ├── youshilei.md │ │ ├── yueruiqi.md │ │ ├── yujianke.md │ │ ├── zhanggaoyang.md │ │ ├── zhanglina.md │ │ ├── zhangqian.md │ │ ├── zhangxuedong.md │ │ ├── zhaokaili.md │ │ ├── zhaoxiaoxin.md │ │ ├── zhaoyinan.md │ │ ├── zhengchengyan.md │ │ ├── zhouhong.md │ │ ├── zhouwenming.md │ │ ├── zhuningning.md │ │ ├── zhuting.md │ │ ├── zhuxiaoping.md │ │ ├── zhuyongjin.md │ │ ├── zongjie-fanliao.md │ │ ├── 第二次作业.md │ │ ├── 第二次课程总结.html │ │ └── 第二次课程总结.md │ ├── lesson3/ │ │ ├── GaoXianfeng.md │ │ ├── Jaykey_Guo.md │ │ ├── LiaoYuemin.md │ │ ├── Risexie.md │ │ ├── WangChangQing.md │ │ ├── caijinpeng.md │ │ ├── cloudyview.md │ │ ├── cuimiao.md │ │ ├── dengxy0907.md │ │ ├── fangqingyang.md │ │ ├── guowei.md │ │ ├── hanwei.md │ │ ├── hewei.md │ │ ├── huangBiLing.md │ │ ├── jianglin.md │ │ ├── leizhen.md │ │ ├── lichen.md │ │ ├── lipeng.md │ │ ├── liujuanjuan1984.md │ │ ├── liuxiaohaohao.md │ │ ├── panqi.md │ │ ├── sophieQi.md │ │ ├── taobao.md │ │ ├── wangwei.md │ │ ├── wangyunfei_zongjie.md │ │ ├── wenliuxin.md │ │ ├── wufan.md │ │ ├── wukuipin.md │ │ ├── xianengqi3.md │ │ ├── xiaochaoge.md │ │ ├── xiaoyi.md │ │ ├── xiongliyu.md │ │ ├── xugaoyang.md │ │ ├── yammy.md │ │ ├── yanqingmu.md │ │ ├── zhaoxiaoxin.md │ │ ├── 第三次作业 交互图.md │ │ └── 谢玉辉.md.md │ ├── lesson4/ │ │ ├── Jaykey.md │ │ ├── Risexie.md │ │ ├── WuGaoxing.md │ │ ├── jianglin.md │ │ ├── liujuanjuan1984.md │ │ ├── panyong.md │ │ ├── taobao.md │ │ └── xiaochaoge.md │ ├── lesson5/ │ │ ├── GaoXianfeng.md │ │ ├── JayChen.md │ │ ├── Jaykey_Guo.md │ │ ├── LiaoYuemin.md │ │ ├── LiuShengsi's homework of lesson5.md │ │ ├── Risexie.md │ │ ├── WANG Xuanding.md │ │ ├── WuGaoxing.md │ │ ├── Zhengchao.md │ │ ├── anjiancai.md │ │ ├── baoguoqiang.md │ │ ├── caijinpeng.md │ │ ├── caozhen.md │ │ ├── chenguoqiang.md │ │ ├── chenrushan.md │ │ ├── chenyanxing.md │ │ ├── chenziwen.md │ │ ├── cloudyview.md │ │ ├── cuimiao.md │ │ ├── dengxy0907.md │ │ ├── diaozhicong.md │ │ ├── donglili.md │ │ ├── fangqingyang.md │ │ ├── fanliao.md │ │ ├── fanqing.md │ │ ├── fengkai.md │ │ ├── guowei.md │ │ ├── hanwei.md │ │ ├── haohu.md │ │ ├── hewei.md │ │ ├── huangBiLing.md │ │ ├── huangjiashu.md │ │ ├── huyong.md │ │ ├── jianglin.md │ │ ├── langjj.md │ │ ├── lichen.md │ │ ├── limu.md │ │ ├── lingxiao.md │ │ ├── linxiyao-homework-lesson5.md │ │ ├── lipeng-学习“异步实现一桌酒席”心得,代码难点分析.md │ │ ├── lipeng.md │ │ ├── liujuanjuan1984.md │ │ ├── liujun.md │ │ ├── liuliyuan.md │ │ ├── liuruyong.md │ │ ├── liushengxin.md │ │ ├── lixiang.md │ │ ├── luoruijun.md │ │ ├── maggiewong.md │ │ ├── marshalcy.md │ │ ├── oyanagchun的作业 │ │ ├── panyong.md │ │ ├── qiujingyu.md │ │ ├── readme.md │ │ ├── shaozhen.md │ │ ├── shenzhili.md │ │ ├── sophieQi.md │ │ ├── sunyan.md │ │ ├── tangjianfeng.md │ │ ├── taobao.md │ │ ├── wangchangqing.md │ │ ├── wangwei.md │ │ ├── wangyunfei.md │ │ ├── wangzhongbin.md │ │ ├── wengguihua.md │ │ ├── wenliuxin.md │ │ ├── wenyunxin.md │ │ ├── wufan.md │ │ ├── wukuipin.md │ │ ├── xianengqi.md │ │ ├── xiongliyu.md │ │ ├── yammy.md │ │ ├── yangchunguang.md │ │ ├── yangtieming.md │ │ ├── yangxuewu.md │ │ ├── yanqingmu.md │ │ ├── yimiao li 5th.md │ │ ├── youshilei.md │ │ ├── zhanggaoyang.md │ │ ├── zhanglina.md │ │ ├── zhaoxiaoxin.md │ │ ├── zhaoyinan.md │ │ ├── zhouqizhou.md │ │ ├── zhuningning.md │ │ ├── zhutinglesson5.md │ │ ├── zhuyongjin.md │ │ └── 谢玉辉.md │ ├── lesson6/ │ │ ├── GaoXianfeng.js │ │ ├── LiuShengsi.js │ │ ├── Risexie.js │ │ ├── WANG_Xuanding.js │ │ ├── Wei.js │ │ ├── WuGaoxing.js │ │ ├── anjiancai.js │ │ ├── babysodme.js │ │ ├── baoguoqiang.js │ │ ├── caijinpeng.js │ │ ├── caozhen.js │ │ ├── caozhen.md │ │ ├── chenrushan.js │ │ ├── chenyanxing.js │ │ ├── chenziwen.js │ │ ├── cloudyview.js │ │ ├── cuimiao.js │ │ ├── cuiyuwei.js │ │ ├── dangfeipeng.js │ │ ├── dengxy0907.js │ │ ├── diaozhicong.js │ │ ├── donglili.js │ │ ├── fangqingyang.js │ │ ├── fanliao.js │ │ ├── fengkai.js │ │ ├── hanwei.js │ │ ├── haohu.js │ │ ├── hewei.js │ │ ├── hitchhacker.js │ │ ├── huangjiashu.js │ │ ├── huyong.js │ │ ├── jaykeyGuo.js │ │ ├── jaykeyGuo.md │ │ ├── jianglin.js │ │ ├── langjianjun.js │ │ ├── lesson9.md │ │ ├── lianghf.js │ │ ├── liaoyuemin.js │ │ ├── lichen_async.js │ │ ├── lichen_sync.js │ │ ├── limingxing.js │ │ ├── lingxiao.js │ │ ├── lipeng.js │ │ ├── liujuanjuan1984.js │ │ ├── liujun.js │ │ ├── liuliyuan.js │ │ ├── liuliyuan.md │ │ ├── liushengxin.js │ │ ├── lixiang.js │ │ ├── lixiang.md │ │ ├── luoruijun.js │ │ ├── mindongquan.js │ │ ├── ouyangchun.js │ │ ├── panyong.js │ │ ├── qiujingyu.js │ │ ├── readme.md │ │ ├── shaozhen.js │ │ ├── shenzhili.js │ │ ├── sunyan.js │ │ ├── tangjianfeng.js │ │ ├── taobao.js │ │ ├── tuyilang.js │ │ ├── wangchangqing.js │ │ ├── wangganzy.js │ │ ├── wangshasha.js │ │ ├── wangwei.js │ │ ├── wangyunfei.js │ │ ├── wangzhongbin.js │ │ ├── weiyang.js │ │ ├── wengguihua.js │ │ ├── wenliuxin.js │ │ ├── wenyunxin.js │ │ ├── wufan.js │ │ ├── wukuipin.js │ │ ├── xianengqi.js │ │ ├── xiongliyu.js │ │ ├── yammy.js │ │ ├── yangtieming.js │ │ ├── yangxuewu.js │ │ ├── yanqingmu.js │ │ ├── yimiao.js │ │ ├── youshilei.js │ │ ├── zhanggaoyang.js │ │ ├── zhanglina.js │ │ ├── zhanglina.md │ │ ├── zhaokaili.js │ │ ├── zhaoxiaoxin.js │ │ ├── zhaoxiaoxin.md │ │ ├── zhaoyinan.js │ │ ├── zhengchao.js │ │ ├── zhengchao.md │ │ ├── zhuting.js │ │ ├── zouhainan.js │ │ └── 谢玉辉六课作业.js │ ├── lesson7/ │ │ ├── GaoXianfeng.md │ │ ├── anjiancai.md │ │ ├── chenguoqiang.md │ │ ├── chenrushan.md │ │ ├── chenyanxing.md │ │ ├── chenziwen.md │ │ ├── cloudyview.md │ │ ├── cuiyuwei.md │ │ ├── dangfeipeng.md │ │ ├── dengxy0907.md │ │ ├── diaozhicong.md │ │ ├── fangqingyang.md │ │ ├── fengkai.md │ │ ├── guowei.md │ │ ├── hanwei.md │ │ ├── hewei.md │ │ ├── hitchhacker.md │ │ ├── huangBiLing.md │ │ ├── huangjiashu.md │ │ ├── jaykeyGuoJian.md │ │ ├── liaoyuemin.md │ │ ├── lingxiao.md │ │ ├── lipeng.md │ │ ├── liujun.md │ │ ├── liuliyuan.md │ │ ├── lixiang.js │ │ ├── lixiang.md │ │ ├── luoruijun.md │ │ ├── qiujingyu.md │ │ ├── readme.md │ │ ├── shaozhen.md │ │ ├── shenzhili.md │ │ ├── taobao.md │ │ ├── wangwei.md │ │ ├── wangyunfei.md │ │ ├── wangzhongbin.js │ │ ├── wangzhongbin.md │ │ ├── weiyang.js │ │ ├── wengguihua.md │ │ ├── wenyunxin.md │ │ ├── wukuipin.js │ │ ├── wukuipin.md │ │ ├── xieyuhui.md │ │ ├── yammy.md │ │ ├── yangtieming.md │ │ ├── yangxuewu.md │ │ ├── yanqingmu.md │ │ ├── yimiaoli.md │ │ ├── yinzhibao.md │ │ ├── youshilei.md │ │ ├── zhanglina.md │ │ ├── zhaokaili.md │ │ ├── zhaoxiaoxin.md │ │ ├── zhaoyinan.md │ │ ├── zhengchao.js │ │ └── zhengchao.md │ └── lesson9/ │ ├── GaoXianfeng.md │ ├── dengxy0907.md │ ├── fangqingyang.md │ ├── guowei.md │ ├── liujun.md │ ├── wayne.md │ ├── weiyang.html │ ├── wukuipin.md │ ├── yammy.md │ └── yinzhibao.md ├── public/ │ ├── libs/ │ │ └── bootstrap-3.3.7-dist/ │ │ ├── css/ │ │ │ ├── bootstrap-theme.css │ │ │ └── bootstrap.css │ │ └── js/ │ │ ├── bootstrap.js │ │ └── npm.js │ └── style.css ├── script/ │ ├── checkHomework.js │ ├── checkMyFile.js │ ├── clean.js │ ├── fs.js │ ├── package.json │ ├── run.js │ ├── scan.js │ ├── start.js │ └── updateTeam.js ├── study/ │ ├── lesson10/ │ │ ├── first-web-app/ │ │ │ ├── app.js │ │ │ ├── bin/ │ │ │ │ └── www │ │ │ ├── package.json │ │ │ ├── public/ │ │ │ │ ├── style.css │ │ │ │ ├── stylesheets/ │ │ │ │ │ └── style.css │ │ │ │ └── words.js │ │ │ ├── routes/ │ │ │ │ ├── index.js │ │ │ │ └── users.js │ │ │ └── views/ │ │ │ ├── error.ejs │ │ │ └── index.ejs │ │ └── github_index/ │ │ ├── index.html │ │ └── public/ │ │ └── style.css │ ├── lesson2/ │ │ ├── github_index/ │ │ │ ├── index.html │ │ │ └── public/ │ │ │ └── style.css │ │ ├── my_personal_info_page.html │ │ ├── sample1.html │ │ ├── sample2.html │ │ ├── sample3.html │ │ └── sample_code.js │ ├── lesson3/ │ │ ├── name_style.js │ │ └── statement.js │ ├── lesson4/ │ │ ├── build_a_human.js │ │ ├── kitchen_workflow.js │ │ ├── object.js │ │ ├── readme.md │ │ ├── sound_off.js │ │ ├── sound_off_2.js │ │ ├── sound_off_3.js │ │ └── vue/ │ │ └── index.html │ ├── lesson5/ │ │ ├── async_function.js │ │ ├── flight_schedule_1.js │ │ ├── flight_schedule_2.js │ │ ├── flight_schedule_3.js │ │ ├── indirect.js │ │ ├── indirect_call.js │ │ ├── kitchen_workflow_async.js │ │ ├── readme.md │ │ ├── type_array_sample.js │ │ ├── type_boolean_sample.js │ │ ├── type_number_sample.js │ │ ├── type_object_sample.js │ │ └── type_string_sample.js │ ├── lesson6/ │ │ ├── scan_files_async.js │ │ ├── scan_files_sync.js │ │ ├── write_file_async.js │ │ └── write_file_sync.js │ ├── lesson7/ │ │ ├── all_words.json │ │ ├── error_data.json │ │ ├── github_index/ │ │ │ ├── easy_vue.html │ │ │ ├── index.html │ │ │ └── public/ │ │ │ └── style.css │ │ ├── homework_readme.md │ │ ├── homework_sample.js │ │ ├── package.json │ │ ├── read_a_json_file.js │ │ ├── readme.md │ │ ├── sound_off.js │ │ ├── test_data/ │ │ │ └── data.json │ │ └── write_a_json_file.js │ └── lesson9/ │ ├── chain_function_call.js │ ├── github_index/ │ │ ├── index.html │ │ └── public/ │ │ └── style.css │ └── readme.md ├── topics/ │ ├── Git实战笔记.md │ ├── JS函数.md │ ├── JavaScript的语法学习指引.md │ ├── MAC-Terminal-command-list.md │ ├── Win-Command-list.md │ ├── callback函数的设计学.md │ ├── js重要语句.md │ ├── 两种定义函数方式的差异.md │ ├── 了不起的axios(http).md │ ├── 代码就是由这些组成的.md │ ├── 作品征集.md │ ├── 函数 - 定义完就执行.md │ ├── 匿名函数使用技巧.md │ ├── 变量命名简明技巧.md │ ├── 同步函数的两种返回结果的方式.md │ ├── 图床教程.md │ ├── 在Heroku上快速部署自己的JS项目.md │ ├── 如何从主项目更新fork的项目.md │ ├── 如何在终端执行代码.md │ ├── 如何查看git push和pr的提交结果.md │ ├── 安装nvm.md │ ├── 定义变量.md │ ├── 相对路径.md │ ├── 第一个webapp.md │ ├── 第一次pull-request.md │ ├── 第一次pull-request错误汇总.md │ ├── 第一次使用Git.md │ ├── 第一次使用JSON.md │ └── 让github-wiki变成图床.md └── webapp/ ├── package.json ├── src/ │ ├── app.js │ ├── bin/ │ │ └── www │ ├── config/ │ │ ├── index.dev.js │ │ ├── index.js │ │ └── index.pro.js │ ├── middleware/ │ │ └── courseInfo.js │ ├── public/ │ │ ├── libs/ │ │ │ └── bootstrap-3.3.7-dist/ │ │ │ ├── css/ │ │ │ │ ├── bootstrap-theme.css │ │ │ │ └── bootstrap.css │ │ │ └── js/ │ │ │ ├── bootstrap.js │ │ │ └── npm.js │ │ └── stylesheets/ │ │ ├── anim.css │ │ ├── github-markdown.css │ │ └── style.css │ ├── request.js │ ├── routes/ │ │ ├── homework.js │ │ ├── index.js │ │ ├── sayToTeacher.js │ │ ├── studentWorks.js │ │ ├── topics.js │ │ └── words.js │ └── views/ │ ├── _head.ejs │ ├── _header.ejs │ ├── _nav.ejs │ ├── _slider.ejs │ ├── error.ejs │ ├── homework.ejs │ ├── homeworkList.ejs │ ├── index.ejs │ ├── sayToTeacher.ejs │ ├── sayToTeacher2.ejs │ ├── studentWorks.ejs │ ├── topics.ejs │ └── words.ejs └── test/ ├── routes_api.test.js └── routes_page.test.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ # Ignore Mac OS desktop services store .DS_Store package-lock.json node_modules dist .vscode script/result script/teams.md ================================================ FILE: README.md ================================================ ## 美好的回忆 该项目记录了一群小白学习js的过程,现封存该项目供所有人回忆。 感谢大家的努力 请[点这里](https://js.7xinsheng.com/)访问我们的家! ![](https://ws4.sinaimg.cn/large/006tNbRwgy1fuzrn9i6vvj3076076jru.jpg) ================================================ FILE: _config.yml ================================================ theme: jekyll-theme-hacker ================================================ FILE: homework/lesson1/Autumn.md ================================================ 第一节课老师运用银行开户的类比帮助我们理解JS(或者说是理解编程)。 ###### 1.银行(内部服务➕核心服务)—> 运行环境(内置库➕V8引擎) ; 客户—> 代码 开户的环境是银行,在这个环境中客户可以得到内部服务以及核心服务,通过这两种服务客户可以成功开户。 同样的,对于代码来说,其在运行环境中可以运用内置库的服务、V8引擎服务处理代码,最终让代码被成功执行。在JS中有两类运行环境,分别是浏览器环境和Nodejs环境。这两种环境的内置库、第三方库不同,在写程序时一定要明确自己处于哪种环境,不要弄混。 ###### 2.核心服务(预处理➕执行)—> V8引擎 (=编译器/解释器) 为了给客户开户,银行工作人员需要对开户信息进行预处理(审核信息准确性)与执行(审查信度)。为了执行代码,V8引擎做的就是让代码被识别被执行。客户开户不必考虑工作人员如何审核信息,小白程序员写代码也不必考虑V8引擎内部如何运行。 编程语言分为编译型语言与解释型语言: 编译型语言将所有信息都预处理后再执行,运行效率高(电脑)开发效率低(程序员) 解释型语言预处理一条信息执行一条信息,运行效率低开发效率高 JS属于解释型语言 ###### 3.内部服务(复印、拍照、查询逾期)—> 内置库 ;第三方服务(公安部门信用鉴定)—> 第三方库 客户开户之前需要做许多准备工作,在银行之内可以复印、拍照、查询预期…在银行之外需要去公安部门开具信用证书…只有运用这些服务做好准备工作才能进行开户。写代码也需要环境内、环境外的内置库、第三方库提供多种多样的服务,这样代码运行时才能种种功能。 在理解了JS的大致框架后老师提供了学习的方向。因为小白程序员不必深究V8引擎内部如何运行,所以在学习的过程中只需要把精力放在如何运用编程语言以及内置库、第三方库写出代码即可。 * 一开始要练习编程语言,熟练语法。 * 之后要熟悉内置库、第三方库的各种服务,让代码能有更多样的功能。 * 最后要不断比较各类服务,找到实现各类功能的最优解决方法。 这个进阶路径很像准备考试的过程,一开始熟练基本概念定理,然后在题海中习得多种解题方法,最后化繁为简总结类型题的最佳解法。 ================================================ FILE: homework/lesson1/ElizabethZhouli.md ================================================ **#** **learning-javascript lesson 1**  **1. 类比代码执行流程** 方式:用“银行为用户开户这一”具象业务架构“一对一抽象成“JS运行环境框架“,框架包含:JS运行环境[浏览器运行环境(v8引擎+内置环境)+Nodejs运行环境(v8引擎+内置环境)]——第三方库——JS代码 **2. 运行环境** 包含浏览器运行环境和Nodejs运行环境 **3. V8引擎** 核心:用来执行代码 **4. 编译器/解释(执行)器** 是V8引擎的组成部分,用来处理和解析代码 **5. 内置库** 是运行环境所提供的一组服务,用来实现代码的功能 **6. 第三方库** 付费或开源的各类服务于JS的工具库 **7. 学习JS的方向** 有难度:变化快+无边界,但也有套路从小白到高手: "掌握编程语言,用编程方式调用服务来完成你的需求"—— “了解和掌握重要的服务能力,使其能服务你的业务”—— “善于比较服务/技术之间的差异性,用最好的方式实现自己的业务”。 加油! ================================================ FILE: homework/lesson1/GaoXianfeng.md ================================================ ## JavaScript 第一课总结 ### 现实生活场景举例类比 JS 代码执行流程及相关概念 客户去银行办理业务,在正式办理业务前填写相关资料,随后将填写好的资料提交给银行办理业务工作人员,工作人员对已填写好的材料进行审核,然后将办理结果提交给客户,银行根据客户自身情况将客户划分为不同等级,如:普通客户、VIP客户等。银行为更好的服务客户,在银行内部提供相关服务,如:身份证复印等。工作人员审核客户提交资料时除审核资料格式填写准确性外,有可能通过调用外部系统检查客户身份合法性等。 以上客户在银行办理业务流程即可理解为 JS 代码的执行流程。即客户填写资料(编写代码),将资料提交给银行工作人员(编辑器与解释器),银行工作人员对材料进行审核(编辑器与解释器解析执行代码),将办理结果返回给客户(返回代码结果)。 银行不为同等级客户办理业务可映射为 JS 运行环境,为普通客户办理业务(浏览器运行环境)、为VIP客户办理业务(Nodejs 运行环境),每一种业务(运行环境)均包括银行内部的服务(内置库)与办理业务(V8引擎,进行预处理与代码执行)。 银行工作人员调用外部系统核实用户身份合法性,即可视为 JS 调用第三方库完成相应功能。 ### 学习 JS 方向 #### 1. JS 学习困难原因:变化快、无边际 #### 2. 学习上升途径 初学阶段:***掌握编程语言***,用编程方式调用服务来完成你的需求; 提高阶段:***了解与掌握重要的服务能力***,使其能服务你的业务(了解内置库与第三方库使用); 进阶阶段:擅于比较服务/技术之间的差异性,***用最好的方式实现你的业务***; 与现自己情况对照,目前刚刚到达提高阶段,需要继续深入了解开发语言的内置库与第三方库使用 ================================================ FILE: homework/lesson1/Huang_Biling.md ================================================ ## 作业_JavaScript编程入门_第一节 1. 类比代码执行流程 代码,是人的需要转化成的、对智能机械的命令。执行命令需要资料和数据。得到资料数据后,还要先将它们审核通过后再送去执行,为的是不让错误卡住执行流程,导致混乱。 命令,可视作“回家休息”,首先,人要进门。资料数据是“门匙”,预处理是“门锁”进行审核,门匙正确,人才可以进行入门的动作。门匙在现实中是已提前由制锁工厂造好。这看起来是外部完成,但内外是相对的。这是预处理(内置服务)。“社会协作”可以看作很多命令“运行环境”,而“家”是V8引擎,比如做饭命令、看电视命令、上网命令,在家里可完成。这些命令需要电饭煲、电视、上网路由、电脑或手机等“编译器”。而这些设备的零部件或其原材料将由厂家的供应商提供,供应商即“第三方”;如果在超市购买的,超市也是“第三方”。银行的“设备”和“第三方”同理(到底是不是呢...)。那么,这个语境里最初的代码(命令)是什么...可能也许大概是人类的生活需要吧...好像圆回来了... 先这么理解着。理解不对的,后面运用时再调整贯通。 2. 运行环境 包括内置库和V8引擎,提供代码从输入到执行完成所需的全部资料、数据、功能等等。 3. V8引擎 是指真正执行代码命令,使计算机、机器完成任务的地方。 4. 编译器/解释(执行)器 将代码转换成机器可以识别的语言的(地方)。比如,电视遥控器将我们按频道的动作,转换成电视机能马上能识别(选台)的语言。 5. 内置库 提供执行命令所需的数据。在“进门”这个语境里可包括门匙,或将人送回家的交通。 6. 第三方库 所有设备的上游供应商或设备流通相关的商家。 7. 学习JS的方向 因为“变化快”(是指语言一直升级吗?视频没看到的落后份子伤不起),所以要让自己经常了解最新的语言发展,比如常看最新的开源项目。 因为“无边际”(因为是面向对象的语言,所以随着社会的快速变化,对象和对象间的关系也不断变化,JS的运用也就无边际了吗?),那不会那么闷了?随时都可以寻找对象,想办法将JS用上。随时都要想办法改进。(也许是我想太多了) 另外, 对“进阶”的理解是,“根据需求的差异性和可行性,灵活运用”。 ================================================ FILE: homework/lesson1/Jaykey.md ================================================ ### 基础-第一课 ###### JS运行环境: 1. 浏览器 2. Nodejs 都含有V8引擎(对代码进行预处理)和内置服务(不同环境有不同)。 核心是**“内置库”**,如何调用会输出什么结果。 ###### Javascript是解释性语言 一边编译,一边执行。**开发效率高,运行效率低** ![浏览器的运行环境](https://ws2.sinaimg.cn/large/006tNc79ly1fpc6fwed7cj30zk0k0grd.jpg) ![Node的运行环境](https://ws1.sinaimg.cn/large/006tNc79ly1fpc6gomz69j30zk0k0q7r.jpg) ###### 用自己的话解释概念: > 运行环境:代码的运行环境,分为浏览器和Nodejs两种 > > V8引擎:运行代码的黑箱,目前只需要知道输入什么能输出什么 > > 解释器:对代码的解释,让机器能够读懂js代码 > > 内置库:js内置的代码库,js的基础和共同点 > > 第三方库:个人或者公司开发的使用js的方法 ##### 目前的学习目标:掌握编程语言 ![最初的学习目标](https://ws2.sinaimg.cn/large/006tNc79gy1fpc6vnpl02j30zk0k00xy.jpg) ------ 小结: 1. JS的运行环境是很灵活的,能直接在浏览器中运行。 2. 一大特点:**边编译,边执行**,使得js的运行效率高,但是运行速度慢。 3. 需要知道不同的运行环境会调用不同的库,但是共同点是**JS内置对象** 4. 目前的学习目标:掌握JS编程语言 ================================================ FILE: homework/lesson1/Learner-Chen.md ================================================ Javascript第一次课程总结 第一次上课,主要是对于编程感兴趣。现在社会的互联网、人工智能持续火爆,也是大势所趋。所以一只很感兴趣。看到新生大学改版后开课,就第一时间报了名去学习。 徐老师讲解JS时,通过对生活中常见的银行开户流程来讲解,通过一步一步引导,初步建立起有关Js代码执行流程的意识。类比优化后的银行开户流程,了解JS代码运行环境,JS运行环境主要分为前端-浏览器运行环境和后端-Nodejs运行环境。但是不一样的内置服务,运行环境之间有了显著性的差异。V8引擎是运行环境中执行代码的阶段。 JS语言是解释性语言,是边编译边执行同步进行,和银行开户最初始阶段相同。不像C/C++语言,是编译型语言,先编译,再进行解释执行。这点是不相同。因此二者在处理效率以及开发效果上迥然不同,各有特色。 内置库与第三方库是有关联的。内置库好比家庭内部自有的图书室,第三方库是外界社会共同开发共同享有的社会公共图书馆。浏览器和Node内置库方面有很多不同,但二者都有JS内置对象。 JS方面,徐老师给我打开了一扇门,当下和徐老师好好学习,一步一步摸索练习。养成自己的编程思想,有自己的独特性。 ================================================ FILE: homework/lesson1/LiaoYuemin.md ================================================ ## Story of Lesson 1 我有一个做运营的朋友,她一直觉得编程很重要,但是却没有多少兴趣去学。其实我也是。但是作为一个软件行业的测试者,还是觉得应该学一些编程的东西。 第一节课后跟她分享上课的感受,我跟她说第一节课的作业需要用markdown写一篇总结。于是有了下面的这段对话。 *** 朋友:我一直没看懂**markdown**是个啥玩意儿? 我:其实跟word一样,你要实现某种文字格式,word里面可以点击相应的功能键来实现,markdown相当于是把你点击的动作编成了可见的语法,最终实现的效果是一样的。比如你要把“朋友”两个字加粗,word里面你是选择“朋友”两个字,然后直接点击加粗键就可以实现,markdown里你可以前后用两个*号把“朋友”两个字括起来,这两个字就加粗了。 朋友:这就是语法,对吧? 我:对的。 朋友:开发里面经常说的运行环境是什么鬼啊? 我:所谓**运行环境**就是实现输入代码输出结果所需要的环境。运行环境包括V8引擎和内置库。 朋友:**V8引擎**是什么? 我:我理解的就像一艘船的发动机,没有发动机船就开不起来,没有这个V8引擎,代码就没办法运行。 朋友:内置库又是什么? 我:**内置库**就是数据库,就像医院的不同科室。一个科室就是一个库,这些所有库加起来构成了医院这个大环境。哦,对了。JS运行环境有浏览器运行环境和Nodejs运行环境之分,不同的环境,内置库是不一样的哦。就跟不同的医院,科室不同一样。但是老师说浏览器运行环境和node运行环境中内置库里有一点是相同的。 朋友:那是什么? 我:JS内置对象。这个我还不是很懂是什么东东。 朋友:那整个代码是怎么运行的呢? 我:那要看它是**编译型语言**还是**解释型语言**咯。C/C++就是编译型语言,他们的运行流程就先是代码输入,然后编译器进行编译,再把编译好的代码交给执行器执行,最后输出结果。而JS是解释型语言,就是边输入边编译的模式,编译器承担了编译型语言里面编译器和执行器的双重工作。相对编译型语言,解释型语言因为流程比较简单,代码执行率比较高,但是也因为编译器承担了更多的工作,所以开发效率比较低。 朋友:哦。那就是内置库和你说那个发动机就构成了运行环境对吧? 我:嗯。但是在实际运行中有可能还需要**第三方库**。 朋友:第三方库又是什么? 我:这就好比你要做饭,这个动作可以在你家厨房完成,但是材料你需要去超市购买,这个超市就是第三方库。相当于别人已经完成的代码,你可以使用它来节约时间和精力,提高开发效率。 朋友:所以你知道怎么学习编程了嘛。 我:我理解的就是你要写好代码就得学会调用内置库和第三方库,就是说你不仅要学会编程语言,并且要对内置库和第三方库非常了解,还要在学习中多比较代码的差异,比如为什么这里要这么写,为什么在另外一个地方写法又不同,就是这样在比较中学习比较好。 朋友:怎么和你讨论了一下突然觉得编程很好玩儿了呢? *** 其实不知道理解得对不对,但是要知道在这节课之前我什么都不知道,markdown都是看到作业后现学的。嗯,这大概是我上过的所有网课上面最有效的一节了。 ================================================ FILE: homework/lesson1/Liuzhengchun.md ================================================ ##第一次作业 距离第一节课过去好几天了,终于抽出时间来写作业了,作业的主题就是理解徐老师在课上讲的那几个概念,用自己的话把它说出来。 这么久才交作业甚是惭愧,第一节课的内容也有些模糊了,不过我会迎头赶上的,这里先给自己鼓励一下,也谢谢徐老师在作业区的每一个回复,这也是促使我继续学习下去的动力之一。 还是按照老师在作业区留下的概念逐一论述一下我的理解,理解不一定全对,但是随着学习的逐渐深入,我的理解会不断更新,朝着正确的方向前进。 老师在课上用一个银行开户的流程来类比编程中的诸多概念。让我印象深刻的不是类比的概念多么容易理解,事实上我当时还是处于懵逼的状态。让我印象深刻的是老师一幅幅流程图,通过简单的箭头指示和图例,清楚的对比了前后流程的优劣。 1. 类比代码执行流程。银行开户需要提交申请,柜台按照规则进行审核,符合要求则通过,不符合则退回,代码运行也是如此,输入代码,然后执行,符合则输出结果,不符合则报错,一长串的字符,看得眼花缭乱。虽然知道执行的一般流程,但是不知道执行的差别,比如说编译型和解释型,我要学的JavaScript就属于解释型的,它是在执行的时候就按照一定的规则解释,是边执行边解释。 2. 运行环境。运行环境是我一直不能理解的,日常生活中的环境指的是除了自己之外一切互相影响的因素,对于另一个不同的人来讲,你自己也成了环境的一部分。课程提到了两个环境,一个是浏览器的运行环境,一个是JS的运行环境。它包括了V8引擎,第三方库,内置库等,每一部分都有自己的功能。不同的运行环境下产生的结果不同,或者结果相同,但是执行过程不同。 3. V8引擎。这个我就把它跟车的发动机类比了,车子是靠发动机才能启动的,启动后的速度远远大于人力和马拉车。代码执行也需要这样一个部件吧。 4. 编译器/解释器。这是代码需要提交到的地方吧,让编译器审核一下,让解释器执行一下。 5. 内置库,就是运行环境自带的库,代码可以直接利用它进行最基本的调用,方便使用者进行编程,它的使用都是最基本的,必不可少的。 6. 第三方库。这是对内置库的一个补充,可以让使用者进行个性化的编程,找到自己需要的方便的工具,但它有可能不是必不可少的。 7. 学习JS的方向。JS的世界才刚刚推开大门的一角,这个世界长什么样都不清楚,但是我想当我需要它帮我实现我的想法时,我能知道怎么使用它。 ================================================ FILE: homework/lesson1/Rachel.md ================================================ ### 一个总结 如果用一句话来总结第一节学的内容,我想是用**银行开户流程**这个类比,非常清楚地阐述整个**业务架构的模式**,以及其中的**重要概念**。 我非常喜欢最后的总结: “开户环境提供集**预处理、执行**于一体的核心业务处理单元,同时还提供了**内置服务**方面用户的业务办理。 围绕开户业务,会有一系列**第三方服务**供用户使用,以满足开户业务的需求。“ 这一句话,让我脱开零星的概念,从整体上去理解JS整个框架结构。 ### 几个概念 **运行环境**:分两类,分别是是浏览器运行环境和NodeJS运行环境 **V8引擎**:对代码进行预处理和执行,对于初级阶段不需要了解V8引擎具体的操作流程; **内置库**:其中有网络库、日志库、JS内置对象等等 **第三方库**: ### 编译型or解析型? 编译型:需要一个专门的编译过程,通过编译器翻译成机器语言。特点:运行效率高,开发效率低; 解析型:一条语句边翻译边执行。特别:开发效率高,运行效率低。JS ### 运行环境 用婴儿喝小学生的生活环境来类比JS的运行环境,浏览器环境和NodeJS环境不能混淆。 两个环境有一个共通的内置库:JS内置对象。 ### 该怎么学JS/怎么提高/怎么进阶? “**掌握编程语言**,用编程方式调用服务来完成你的需求” ——基础 “**了解和掌握重要的服务能力**,使其能服务你的业务”——学会第三方库 “善于比较服务/技术之间的差异性,**用最好的方式实现你的业务**”——找到解决问题的更好方法 ================================================ FILE: homework/lesson1/Risexie.md ================================================ 第一节课总结 =========== * ### 类比代码执行流 老师使用了一个在银行创建户口的例子,为我们说明了在js当中代码的执行流程,帮助我们理解“在终端输入代码”,到“终端返回我们结果”这样一个过程,是如何实现的。 我们在终端输入代码,相当于我们在银行股柜台填写个人信息,但是开户的要对我们的信息进行多次加工,我们的信息需要被添加、复制、粘贴、打印,非常麻烦。这个时候银行会有一个专员帮助我们来执行,给我们提供服务。所对应的也就是“运行环境”给我们提供的内置服务。 在个人信息被处理完毕,填写到所需表格之后,我们银行的开户人员会再核对一遍我们所提供信息的完整度和正确性,然后真正地帮助我们开户。也就是在运行环境里面的v8引擎会对代码做的事情。 * ### 运行环境 代码在被执行时所处的环境,把我们自己比做代码。就好像你同样是去餐厅吃饭,民工饭堂需要自己端着碗去让服务员给我们夹菜,但是米其林三星餐厅则会把菜摆的美美地放上我们的餐桌。我们同样是为了达成“把肚子填饱”这个目的,但是我们身处的环境不一样,达到目的的方式也不一样。 * ### V8引擎 不要以为电脑现在能够做这么多事,能够执行这么多操作,就代表电脑很“聪明”。其实电脑能够接受的信息就是0和1,而电脑现在能”看懂“我们在终端敲的英文:“`git add.` , `git push -m`等指令是因为编译器已经帮我们把代码编译成了电脑能够“看得懂”的01010,电脑才能够执行我们的代码。而V8引擎,就包含编译和执行两个功能。 * ### 解析器和编译器 解析器能够一边编译代码一边执行,能让我们在敲完代码之后马上看到相对应的效果。编译器只能编译代码之后,再把编译后的代码送到执行器,不利于开发。 * ### 内置库 同样把民工饭堂和米其林三星餐厅作为例子,民工饭堂的“内置库”是一个简陋的厨房,大堂里面给食品加热的设备,服务员可以从设备中,给我们打饭。 米其林三星餐厅的“内置库”是一个专业,宽敞,明亮的厨房,从厨房上得上菜处到客人餐桌有一个专业的菜品传递链。菜从平板锅做好之后,还要经过食品检测员,再传递到传菜员最后送到我们的餐桌。 * ### 第三方库 想象有一家餐厅,食物是从自己的厨房制作的,但是大堂的服务却*“外包”*了出去,是从另外一家公司负责的。而这家公司所提供的环境和人手,就是“第三方库”。 * ### 学习JS的方向 我们敲代码这个行为,其实就是为了让一个软件能够实现我们所需要的功能。一开始我们什么都不懂,需要去学习实现功能的相关代码。好不容易才把我们所需的功能实现。 后来我们了解也熟悉了实现功能的方法,但是随着学习的深入,我们了解到了实现同一功能不止一种方法。我们可以使用不同的语言、环境、第三方库,去帮助我们实现同一功能,又因为不同的语言和环境。实现功能的方式都是各不相同的,我们需要了解他们的不同,学习不同的实现方法。 到最后我们所有的方式都玩了一遍,我们了解的不同方式之间的差异和优劣。我们可以衡量不同方式的利弊,去选择一种最“合适”的方式,去实现我们的需求。 ================================================ FILE: homework/lesson1/SunBo.md ================================================ 第一次作业 # 类比代码执行流程 自己是第一次接触真正的编程,徐老师课上的类比的方式不仅印象深刻,而且感觉是从底层上告诉了自己,JS或者说一种编程语言到底是怎样的一种存在。自己以前看过一些平面设计软件的教程,html,css一些最基础的内容,但我觉得自己学习一门知识最重要的是在开始弄明白,这门知识能用来做什么,我们平常直观看到的一些“样子”,“功能”到底是通过什么工具连接的。 >在类比代码的执行流程中涉及到了很多完成“JS”这件大事中需要的一些“工具”,这个过程就像我们在银行办理一个开户过程一样,需要一个环境,需要项目发起者(申请人),核对,执行,申请者与窗口的交互,最终出结果。接下来,在这个过程中我们会遇到一系列"服务“,“人员”,和“工具”... # 运行环境 >如果你的银行建在田野的账篷里这种环境,你再聪明也办不了业务。银行办理业务你也会遇到不同的环境,比如普通客户环境,椅子冷。VIP客户环境,椅子柔软温暖。 代码的执行过程肯定需要一个环境,十万个冷笑话中的河神会告诉你“年经的工程师啊,你是需要在浏览器中运行呢,还是在NODE运行呢?” 浏览器和node就是我们代码的环境,简单的可以理解为一个对应前端,一个对应后端。 # V8引擎 * 我是小白,这么高深的V8引擎,小白先了解就好喽。学开车,前期就先不要考虑发动机的原理。 >当你去银行办理业务时,会有大堂工作人员帮你填单子,初步核对你的条件,信息,单子格式等,有没有写错字;窗口里面的工作人员帮你通过银行的系统等再次审核你,录入你的信息,对信息进行解释,执行你办理的业务。 * V8就相当于解释/执行器,核对,翻译,执行整个业务,把结果通过窗口送给我们。 # 编译器/解释(执行)器 * 编译器相当于一个预处理的过程,就像在银行输业务时,大堂工作人员的职责一样。 * 解释(执行)器相当于窗口内的工作人员,正式开始处理、执行你的业务,并要给你一个结果。 * JS语言是将两个过程放在一起进行的。 # 内置库 * JS内置的 * JS语言学习中主要就是对内置库和第三方库的使用。 * 是小白重点学习,主要学习的部分。 # 第三方库 * JQuey就属于第三方库,反正以前一直感觉这个东西好像挺酷似的。 * 还要几个课上讲的库,因为笔记在家,现在回忆中只能想起JQuery了。 # 学习JS的方向 >* 用代码实现相应的小需求 >* 会比较不同库,不同功能如何搭配才能最优 >* 基础知识自己最好在业余时间也进行相当的补充,更好的完成 ================================================ FILE: homework/lesson1/WangChangQing.md ================================================ # 第一节课总结 form 王长庆 因为之前一直在忙别的事情,所以直到这两天才开始疯狂赶进度。好在课程开始之前有做过徐高阳老师布置的准备作业,所以只需要重温一下,便可以上手了。 看完了第一节课的视频回放,感觉似乎并不是特别难理解。我把我的想法和理解写一下,不知道对不对,还请高阳老师指正。 ## 代码是什么? 所谓代码,实际上就是程序员与计算机之间沟通、交流的时候,所使用的一种语言。因为计算机是听不懂一般意义上的中文或者英文的,所以就需要一门特殊的语言,让计算机可以知道程序员想要它做什么,怎么做。 计算机很强大,它的硬件(比如CPU、硬盘)决定了它的计算能力、反应速度、记忆力要比我们人类强得多,根本不在一个数量级。所以,让计算机来执行计算任务,可以大幅度提高我们的工作效率。 那么代码就是一种程序员和计算机都懂、都能理解的语言,也是计算机和程序员交流和沟通的媒介。 通过代码,计算机得以调用它的硬件设施,来完成程序员要求它完成的任务。程序员也可以根据计算机的反馈,来知道任务出现了什么问题、得到了什么结果。 ## 计算机如何工作? 代码发展到今天,已经非常完善和复杂了,当然,也非常高效和强大。 程序员首先将一行行代码输入特定的终端,代码会首先到达对应的“后台”,也就是“编译器”,进行预处理和解析。因为复杂的代码需要先进行分析、校对和优化。 既然是一门语言,就会有词汇、语法、词法,就像中文和英文一样,错别字和病句是无法被别人所理解的。因而需要先确保这些代码通顺、流畅、可以被计算机读懂。 解析之后,代码会达到“执行器”,这时候,计算机就会根据它所理解的内容,来调动它的硬件设施和强大的计算、处理能力,来完成程序员需要它完成的任务。这就叫“执行”。 执行完毕之后,计算机这一阶段的工作也就完成了。程序员可以根据计算机输出的结果,来进行下一步的操作。 当然了,实际工作当中,为了提高效率和完成更加复杂的任务,编程语言的“运行环境”中还包含了很多“内置库”。这一点我还没有太多地接触,不过我个人理解应该是说,很多常规性的工作可以用模块化的方式来解决。就像物理、数学里面有很多公式和定理一样,就不用每次都证明一遍了。 ## JS有何特点? JS有一个很有趣的特点是,其他的编程语言提交之后,都是先解析,再执行,而JS是一边解析,一边执行。 就像大多数人都是先盛饭,再吃饭,而JS是一边盛饭,一边吃饭。虽然有点不太雅观,但是不失为一种很有效率的“吃饭”方式(๑*◡*๑) 。 因此,JS的开发效率高,但是运行效率低。一边盛饭一边吃饭的话,当然可以很快地品尝出饭的滋味,但是就没有盛好饭之后再大口吃更豪爽,更痛快。 ## 学习JS的方向 就像出门旅行一样,刚开始的时候,我们只能徒步、骑自行车。又累又慢。 慢慢地,我们学会了坐公交车、打车,甚至坐火车、坐飞机、坐宇宙飞船。这个时候已经不是我们自己在“劳动”了,变成了使用别人的服务,来让我们更快地到达更远的地方。 最后,我们还要知道各种旅行方式之间的差异,用最好的方式去达到我们想要去的地方。比如中远途旅行的话,遇上天气不好的时候,高铁是比飞机更好的选择。 ================================================ FILE: homework/lesson1/Wei.md ================================================ # 小白学JS 第一课总结 20170811 ### 1.银行开户类比JS代码执行流程 银行开户流程 * 填写申请单 * 审核 * 发卡 具体开户业务 1.开户环境:提供一组服务,该服务包含接受申请、检验申请单信息和核对资格。提供内置服务和核心服务。 * 内置服务:为满足用户填写订单时提供的一组内部服务。 * 核心服务:涵盖预预处理和执行的服务,是银行的核心业务。预处理:在真正执行开户前进行信息检查的处理过程,以保证执行处理的效率。执行:执行开户操作的过程,操作完成后并返回想要的开户结果。 2.第三方服务:围绕开户服务,会有一系列银行之外的第三方服务供用户使用,以满足开户需求。 *JS运行环境框架* * JS运行环境对应银行开户环境。 * JS代码对应用户。 * 第三方服务对应JS第三方库,来满足JS代码更多的需求。 *** ### 2.运行环境 JS的运行环境由内置库、V8引擎组成 JS有两大类运行环境: * 浏览器环境和Nodejs环境:两者最大的区别在于内置库和第三方库的不同。 *** ### 3.V8引擎 在JS中,V8引擎是把开发人员写的 JS 代码转换成高效、优化的代码的解释/编译器,负责预处理和执行,具体处理过程处于“黑箱”阶段。 *** ### 4.编译器/解释(执行)器 * 编译型语言:代码需要一个专门的编译过程,将代码翻译成机器语言,其优点是运行效率高,缺点是开发效率低。 * 解释性语言:代码边执行边翻译,优点是开发效率高,缺点是运行效率低。 *JS属于解释性语言,代码输入后,由编译器/解释器进行分析语法、分析词法、分析语义、优化代码、解释代码、执行代码。* *** ### 5.内置库 JS内置的一系列打包好的工具,其类型众多、功能丰富,帮助开发者简化和优化开发过程。 *** ### 6.第三方库 和内置库的功能一样,帮助开发者简化开发过程,优化产品,但并不属于JS内置,需要额外下载。 ### 7.学习JS的正确姿势 * 掌握编程语言,用编程方式调用服务来解决问题 * 了解和掌握重要的服务能力,使其能服务我们的需求 * 比较服务/技术之间的差异性,用最好的方式实现你的业务 *** *撸起袖子就是干,紧跟老师步伐,记录错误,有报错问google!* ================================================ FILE: homework/lesson1/WuGaoxing.md ================================================ 运用下面这些关键词,把你知道的写出来 1. 类比代码执行流程:医生诊治病人的过程,学生上学的顺序,社会运行的次序 2. 运行环境:由不同事物组成的特定套路,环境不同 套路不同 3. V8引擎: 一个隐藏很深 较底层的平台 提供机器与代码的交互 4. 编译器/解释(执行)器 : 对代码转换成机器可识别的二进制,机器安装二进制执行 5. 内置库:官方内含的套件礼包,较正式和常用 6. 第三方库:非官方定制化的,超级大礼包,无好坏之分,全看你是否能用到 7. 学习JS的方向:入门 多问自己什么最重要,不能钻牛角尖搞研究。实用为主。 ================================================ FILE: homework/lesson1/XGunn-lesson01.md ================================================ \# 第一课总结 \## 1.类比代码执行流程 以银行受理客户业务流程类别代码执行流程。 \## 2.运行环境 JS运行环境包括浏览器运行环境和Nodejs运行环境,运行环境是用来处理和执行代码并输出结果。 \## 3.V8引擎 V8引擎高效执行代码,Google开发 \## 4.编译器/解释(执行)器 编译器用来分析词法、语法、语义、优化代码 解释器用来解释代码、执行代码 \## 5.内置库 js自带的工具,可以直接拿来使用。 \## 6.第三方库 外部机构提供的工具,可调用。 \## 7.学习JS的方向 学习编程语言,解决业务需求。 注意辨析工具差异。 ================================================ FILE: homework/lesson1/ZhengChao.md ================================================ ## JavaScript Lesson1 学习心得 #### JS两大构成部分 ##### JS代码 1. ###### 两个概念:编译型语言(比如C,C++)和解释性语言(JS) 2. ###### JS代码属于解释性语言 3. ###### 从解析器看来,要处理的代码不仅包括JS代码,还包括把内置库,第三方库服务整合的代码集合 ##### JS运行环境和第三方库 1. ###### 两大运行环境分别是浏览器和NodeJS - ###### 浏览器运行环境可用于前端 - ###### NodeJS运行环境可用于后端 2. ###### 单个运行环境的构成: - ###### V8引擎:编译解析代码 - ###### **内置库** - ###### **第三方库** ================================================ FILE: homework/lesson1/anjiancai.md ================================================ # 第一次学习Javascript总结 标签(空格分隔): 未分类 --- #类比银行开户流程环境讲解程序运行环境 通过不断优化银行开户的步骤,最终完成一套设计完美的流程。 ![优化后的开户流程][1] 整个流程设计两大主体部分:用户和银行,用户和银行之间涉及三大步骤:请求服务、输入和输出。而银行内部拥有建立的开户环境,开户环境中包括内置服务、预处理和执行,其中内置服务部分是为了预处理和运行做的前期准备,预处理是为执行部分顺畅运行做的检查工作,而执行部分是开户的核心部分。 ![构建业务架构][2] 银行根据用户的不同分为普通用户和VIP用户,其实每类用户包含相同的步骤,开户环境分别抽象为内置服务和业务核心两部分,而业务核心就打包合并了上述中的预处理和执行部分。除此之外还需要第三方服务,因为自己的环境中需要链接外部已经建立的优秀流程部分,需要的时候只需调用即可。 ![JS运行环境框架][3] JS运行环境框架与上述银行开户的业务架构极其相似。JS代码如同用户,JS运行环境如同银行环境,浏览器运行环境和Nodejs运行环境如同银行中的两类用户的环境,而每类环境中V8引擎负责业务核心。值得注意的是,两类环境中都存在内置服务和第三方库,但是各自的内容都不相同。 #编译型语言和解释型语言 编译型语言(如C语言和C++)是先编译后运行,需要一个编译代码的过程,通过编译器翻译成机器语言。 特点:运行效率高;缺点:开发效率低。 ![编译型语言][4] 解释型语言(如JavaScript)是边编译边运行,每一句的代码都是边编译边运行的。 特点:开发效率高;缺点:运行效率低。 ![解释性语言][5] [1]: http://wx3.sinaimg.cn/mw690/95a79662ly1fihd5trymgj20mn0irdis.jpg [2]: http://wx3.sinaimg.cn/mw690/95a79662ly1fihd5uef3qj20k70d9wg0.jpg [3]: http://wx4.sinaimg.cn/mw690/95a79662ly1fihdw40385j20k20dfjt3.jpg [4]: http://wx4.sinaimg.cn/mw690/95a79662ly1fiheed1dt0j20kx0cyq4j.jpg [5]: http://wx3.sinaimg.cn/mw690/95a79662ly1fiheedv6zij20mp0bomyq.jpg ================================================ FILE: homework/lesson1/baoguoqiang.md ================================================ #类比代码执行流程 首先引入生活中在银行开户的这么一个流程,讲解了在开户过程中所需求的种种,我们把这些种种叫做开户环境;一步一步进行优化处理,最后达到满意的效果; 从这个生活中的例子引导到javascript的运行环境; #运行环境 javascript的运行环境分为:浏览器运行环境;NodeJS运行环境 这两种运行环境都是由内置服务和V8引擎,第三方库组成 #V8引擎 V8引擎就是运行环境中的一个预处理 # 编译器/解释(执行)器 在javascript的运行环境里,编译器和解释器是合二为一的,一边编译一边解析; #内置库和第三方库 这两个库我们在编程的时候都是要学会调用的,要熟练掌握技巧 #学习JS的方向 个人是小小白,之前从未接触过编程,刚开始的时候,直播还能看的懂,到作业部分简直就是蒙圈,还好有老师写的非常详细的文档, 一开始就是一点方向也没有就像无头的苍蝇乱飞,文档要仔仔细细的看才可以,边看边实操效果更好。 在这里也非常感谢王云飞同学的帮助的鼓励,非常耐心的去指导我这个小小白。 由于种种原因到现在才交第一次的作业,可能是最后一个提交的,但是我不想放弃,现在一有时间就是在看文档和书籍,谢谢老师的指点 ================================================ FILE: homework/lesson1/caijinpeng.md ================================================ ## 第一次作业 ### 提交人:Marshalcy #### 代码执行环境 我用过调用各种库(内置库和第三方库)写好我的代码后,打包成工程代码,发给解释器;这个过程好比是我去银行开户,通过大堂经理等人的帮助后,将我的个人信息完整准确的填写在申请表上,然后交给银行柜台员工,如果信息表信息无误,则通过申请,柜员发卡给我;如果还有错误,ta会将信息表给我,告诉我哪里错了,需要重新填写,好比解释器报错。 #### 运行环境 好比是饭店的后厨,里面包含洗菜、切菜、炒菜的,最后将炒好的菜交给前台服务人员。 #### V8引擎 后厨工作人员,炒菜的,将切好的菜交给他,他炒好了装盘拿给你或者炒糊了,也给拿给你。 #### 编译器和解释(执行)器 同v8引擎, v8引擎就是javascript的编译器和解释器。区别在于,编译型语言的编译器和解释器是分开的,相当于先洗菜,切菜;切好后交给解释器,炒菜; 而js的编译器和解释器是在一起的,一个人完成洗菜、切菜、炒菜。 #### 内置库 就是后厨内提供的,已有的服务,比如煤气啊、菜刀啊等等和炒菜相关的服务。 #### 第三方库 后厨内不提供的服务,外面人提供的服务,比如菜刀不够快,需要的磨刀服务。电话预约送菜上门服务等等。 #### 学习js的方向 先学习如何使用内置库和第三方的库,帮自己完成自己的需求。 然后具体掌握,了解内置库和第三方库,能调用他们服务我的业务需求。 最后能根据业务需求,知道什么时候用什么样的库能最好的完成我的需求。 ================================================ FILE: homework/lesson1/caozhen.md ================================================ # 第一次作业 ### 代码执行流程的类比 #### 描述 老师课上通过零基础的**类比方法**,让我们理解了代码执行是怎么回事; 在银行开户案例中;谈到了几个弊端和改进: - 银行开户的**核心业务动作**是:先审核材料,再执行处理 - **弊端[1]**审核和执行流程积压在1个工作人员身上,顾客等待时间过长;**改进[1]**将工作人员区分成大厅人员(审核)&窗口人员(处理),银行压力减轻(*软件功能分解*) - **弊端[2]** 对顾客来说,需要交两次不方便(*个人复杂交互*); **改进[2]** 由大厅工作人员直接交到窗口,不需要个人转交(*优化交互设计*) - **弊端[3]** 对顾客来说,需要识别银行的不同角色(大厅人员&窗口人员); **改进[3]** 增加窗口的概念,顾客直接面向窗口即可( *(类)封装*) - **弊端[4]** 顾客可能还需要一些额外服务 ; **改进[4]** 银行内部增加提供这些服务 因此,我们得到了开户环境:包括内置服务、预处理、执行 - **补充[1]** 区分不同的用户等级,可以分别定义针对不同用户的开户环境 - **补充[2]** 用户可能同时伴随有其它非银行需求,因此还可以增加第三方服务 #### 总结几个类比 - 银行开户环境 vs JS运行环境 - 银行核心业务 vs V8引擎 - 审核&执行 vs 编译器&执行器 - 银行内置服务 vs 内置库 - 非银行服务 vs 第三方库 - 开户环境由内置服务&核心业务组成 vs JS运行环境由内置库&V8引擎组 - 针对不同用户的开户环境 vs 浏览器运行环境&NodeJS运行环境 #### 总结几个代码开发理念 - 由于软件可靠性差导致的软件功能分解 - 由于个人复杂交互导致的优化交互设计 - 为了避免个人不合理操作导致的类封装 ​ ### 运行环境 - JS的运行环境分为两类:浏览器运行环境&NodeJS运行环境 - 黑盒:直接把运行环境当成一个黑盒子,初学者完全不需要关心代码实际处理过程 - 由内置库和V8引擎组成:写代码实际上就是在使用(调用)这些内置库;写好后将代码送入V8引擎 再次类比,到底什么是运行环境? - 比较婴儿和小学生的生活环境,有相同,有不同,有差异性 - 浏览器运行环境&NodeJS运行环境同样有差异性,他们之间的内置库是不一样的 ### V8引擎 - 是JS运行环境的**核心**;实现两个功能:对JS代码编译、执行 - 真正写代码的时候,完全不需要关注它 ### 编译器/解释(执行)器 - 编译:在代码执行前,对代码预处理(分析代码&优化代码等) - 执行:运行代码 - 编译型语言:执行前需要先经过编译的过程,将全部代码翻译成机器语言再交给执行器执行,例如:C/C++/Java等 - 解析型语言:一条语句,一边翻译一边执行,没有明显的先编译过程,例如:JavaScript等 ### 内置库 - 运行环境中的内部服务 - 不同类型的运行环境,内置库不完全一样 ### 第三方库 不属于运行环境,但是代码执行不可缺少的组成部分 ### 学习JS的方向 结合个人的方向,希望通过JS的学习,对前端技术有一个比较全面的掌握和理解。 ================================================ FILE: homework/lesson1/chaigaoping.md ================================================ 1.类比代码执行流程 代码传入到编译器和解释器之后,经过编译/解释处理,然后输出结果。 2.运行环境 运行环境就是能够使代码条用内置服务的一个环境,里面包含了两个运行环境:浏览器运行环境和nodejs运行环境。两者都有V8引擎,它可以理解为一个对代码进行预处理和执行的黑盒子。 3.编译器/解释(执行)器 一个是对我们的代码进行分析词法、语法、语义、优化代码,另外一个是解释代码、执行代码。 4.内置库 某种核心功能的实现集合。 5.第三方库 可以优化核心功能的集合。 6.学习js的方向 因为我这份作业是在开课后的20天,31号才补交的。从过去三周的经验来看,除了听老师的课只外,还要投入时间去玩代码。去把基础补上来。还有就是要和一群人一起走。最后是要有很强的目标感。自己之前就尝试过学编程,但是失败了。这次重新捡起来,发现自己对于技术还是没有死心。既然没有死心,那就便有了希望。 ================================================ FILE: homework/lesson1/chengjun.md ================================================  ###【程君的课后总结】-**javascript** 1.类比代码执行流程 银行的开户流程 请求——输入——输出 请求:内置服务 输入:预处理 输出:执行 可以把预处理与执行合起来,在内部解决,称为业务核心 于是:JS 请求:运行环境内置库与第三方库 输入:工程代码 输出:解释器执行 2.运行环境 浏览器运行环境:包括内置库和V8引擎 nodejs运行环境:包括内置库和V8引擎 运行环境的类比:婴儿的生活环境,小学生的生活环境都是不一样,如果婴儿生活在小学生的生活环境就会存在问题。 每个生活环境中,都存在一些模块,比如,爸爸、医院、家、玩具等等。相当于一个库。 也就是说,在写JS时,一定要明白是写浏览器环境的代码还是在nodejs。 3、V8引擎 不用管它,相当于一个黑盒, 4、编译器/解释器 编译型语言,执行之前先来进行编译,分析词法、分析语法、分析语义、优化代码。比如C++. 需要一个专门的编译过程,通过编译器翻译成机器语言,特点:运行效率高,缺点:开发效率低 解释型语言:变解释变执行,一条一条执行,不会用明显的编译过程,非常简单,分析词法、 分析语法、分析语义、优化代码、解释代码、执行代码。 一条语句执行的时候才翻译,特点:开发效率高,缺点:运行效率低。 5、内置库 非常重要的仓库, 代码首先调用内置库,然后送过去执行,最后给出结果。 浏览器运行环境的内置库: JS内置对象、webAPI、webGL、HTTP、webRTC、canvas NODE运行环境内置库:JS内置对象、Node API 6、第三方库 浏览器第三方库: Node第三方库: express koa webpack promise 7、学习JS的方向 1、掌握编程语言 2、了解和掌握重要的服务能力 3、比较服务和技术之间的差异 ================================================ FILE: homework/lesson1/chenlingmin.md ================================================ # 【Javascript第一次作业】总结——陈玲敏 ## 类比代码执行流程 | JavaScript | 解释 | 银行 | 解释 | | ----------- | ---------------------------------------- | ----- | ---------------------------------------- | | 运行环境 | 分为两种:**浏览器运行环境**和**Nodejs运行环境**。 | 开户环境 | 提供一组服务,该服务包含接受申请、检验申请单信息和核对资格。提供集**预处理**、**执行**于一体的核心业务处理单元,同时还提供**内置服务**方面用户的业务办理。可分为两种:**普通用户的开户环境**和**VIP用户的开户环境**。 | | 内置库 | 网络库、日志库、JS内置对象... | 内置服务 | 为满足用户填写订单时提供的一组内部服务。 | | V8引擎 | Node:JS内置对象,Node API; 浏览器:JS内置对象,WebAPI,WebGL,HTTP,WebRTC,canvas; | 核心 | 业务处理的核心,涵盖**预处理**和**执行**两个模块。 | | | | 预处理 | 在真正执行开户前进行信息检查的处理过程,以保证执行处理的效率。 | | 编译器/解释(执行)器 | 一个可以执行代码的黑盒。 | 执行 | 执行开户操作的过程,操作完后并返回想要的开户结果。 | | 第三方库 | Node:Express,Koa,Webpack,Promise; 浏览器:jQuery,Vue,AngularJS,React; | 第三方服务 | 满足开户业务的需求 | | JS代码 | | 用户 | | ## 编译型和解释性差异? | | 解释 | 特点 | 缺点 | | ---- | ------------------------- | ----- | ----- | | 编译型 | 需要一个专门的编译过程,通过编译器翻译成机器语言。 | 运行效率高 | 开发效率低 | | 解释性 | 一条语句执行的时候才翻译。 | 开发效率高 | 运行效率低 | ## 学习JavaScript的方向 ##### 该怎么学JavaScript? > 掌握编程语言,编程方式调用服务来完成你的需求 ##### 该怎么提高? > 了解和掌握重要的服务能力,使其能服务你的业务。 ##### 该怎么进阶? > 善于比较服务/技术之间的差异性, 最好的方式实现你的业务。 ##### 学习JavaScript的难度: > 变化快和无边际。 ​ ​ ================================================ FILE: homework/lesson1/chenqiong.md ================================================ # JavaScript 入门课第一课总结 ## 用现实生活中的例子来类比代码执行流程 老师用银行开户的流程类比代码执行的流程,并通过几个版本的演进来类比业务的持续迭代。这些迭代可以说都是在之前版本的执行过程中,观察总结,进而演进而来,一个产品的迭代也应是如此。 ## 运行环境 JavaScript 运行环境有两种:浏览器和 node 。当我们打开浏览器,实际上是告诉计算机,帮我起一个浏览器的运行环境,之前只知道打开浏览器就是看网页而已。 ## V8 引擎 > V8 是一个由 Google 开发的开源 JavaScript 引擎,用于 Google Chrome 及 Chromium 中。 > V8 在运行之前将 JavaScript 编译成了机器码,而非字节码或是解释执行它,以此提升性能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript 程序与 V8 引擎的速度媲美二进制编译。 ## 编译器/解释(执行)器 JavaScript 是解释型语言,代码是边编译边执行的,开发效率比较高,但运行比较慢。其他编译型语言如 C 、C++、Java 等都是需要先编译,编译通过后才能执行,特点是运行快,但开发效率不高。印象最深刻的就是以前自学 Java 的时候,写好代码,需要运行 javac 指令,对代码进行编译。 ## 内置库 JavaScript 语言本身自带的一些基本功能实现,包括基本的数据结构、模块、函数等,已经封装好了,开发者通过阅读文档,获知调用方法之后,就可以直接调用。其它语言也是如此。 ## 第三方库 一般指用同种语言开发的拓展功能,用来满足多样化的需求。也有用别的语言开发的第三方库,供 JavaScript 编写的代码调用。也有个说法叫不要重复造轮子,这里的轮子应该也是指的第三方库,一个功能,如果别人已经写好了,直接拿来用就可以了,没必要再自己写一个。 ## 学习 JS 方向 从一个最简单的项目开始,然后用各种新学到的东西对项目进行完善,并进行比较,多练习。 ================================================ FILE: homework/lesson1/chenrushan.md ================================================ # Hello, JavaScript 总结 从设计一个银行开户流程,一次次升级,然后抽象出业务架构,类比到JavaScript运行环境架构,清晰易懂。 我们写代码让计算机满足我们的需求,就如我们提交申请,让银行帮我们开户,这个过程需要一些服务,需要经过一些处理步骤,来完成我们的开户需求。 # JavaScript运行环境架构 ![](https://ws1.sinaimg.cn/large/006tKfTcgy1fs0fi2zof0j31kw0vxgsh.jpg) ![](https://ws2.sinaimg.cn/large/006tKfTcgy1fs0f5ucectj31kw0w11kx.jpg) 由银行业务架构到JavaScript运行环境架构。 有了整体架构后(心中有图),逐一理解架构中的组成部分。 - JavaScript运行环境架构 - 运行环境 - V8引擎 - 编译器/解释(执行)器 - 内置库 - 第三方库 ## 1. 运行环境 运行环境,类比了不同人的生活环境,代码的运行也需要一定的环境,应该是能够使代码被计算机理解并运行起来的环境。 ### 1.1 V8引擎 V8引擎,类比银行员工处理申请材料,帮客户办理开户,个人理解为处理我们编写的代码,执行代码,计算结果的模块。 #### 1.1.1 编译器/解释(执行)器 将代码“翻译”成计算机能够识别的语言,然后执行。 ### 1.2 内置库 运行环境中提供的基础服务,供代码调用。 ## 2. 第三方库 在运行环境之外,由第三方提供的开源/付费的服务,通过调用可实现某些功能。 # 学习JS的方法 在JavaScript运行环境架构中,代码是如何运转的? ![](https://ws1.sinaimg.cn/large/006tKfTcgy1fs0g496k45j31kw0lwat7.jpg) 我们的工作在最左边,写的代码以及调用的内置库和第三方库。 入门:掌握编程语言,学会怎么调用库来满足需求。 提高:知道什么库可以满足需求。途径一,自己查找,途径二,问。 进阶:知道解决同样需求的库之间的差异,能够选择合适的库来更好地实现业务需求。 ================================================ FILE: homework/lesson1/chenyanxing.md ================================================ ##【第一次作业】 ———————————————————————————————————————— #####--*author:陈燕杏* #####--*version:V1* #####--*create_time:2017-08-17* ———————————————————————————————————————— ###1. 类比代码执行流程 ####对于代码执行流程的理解:我们写好的代码,来到运行环境,经过编译器/解析器一系列(分析词法、分析语法、分析语义、优化代码、解析代码、执行代码),运行完成后,输出结果。JS代码编写的过程中,需要调用浏览器或者Nodejs的内置对象来运行,并且提供了可拓展的第三方的类库,使功能强大。 ###2. 运行环境 ####JS运行环境:分为浏览器和Nodejs。他们里面的运行环境里都有V8引擎和内置服务。当然少不了的是我们底层的JS代码,对于JS运行环境的运行还需要第三方库的支持。 ###3. V8引擎 ####这是同学的笔记:V8引擎是一门底层技术,chrome就是基于V8引擎构建的,直接的体现就是chrome浏览器中写JS的代码,代码的执行速度快。 ###4. 编译器/解释(执行)器 ####编译器/解析器:就是在运行环境中一个可以执行代码的黑盒。代码的输入通过其编译/解析输出结果。 ###5. 内置库 ####内置库是该运行的环境下,可以调用出网络库,日志库,JS内置对象···浏览器和Node的运行环境内置库里,JS内置对象是他们共同一样的部分。 ###6. 第三方库 ####第三方库我的理解是对运行环境提供了更加强大的功能支持。 ###7. 学习JS的方向 ####跟着老师的节奏,学习编程的思想,从而入门编程的世界,最重要是掌握这门技能。 ####体会:第一节课的知识点因为都是没有见过的,脑子里没有可以迁移的知识来理解,所以上述写的理解没有很深刻到位。看了学霸同学们的作业,有些不懂的地方也会豁然开朗。 ================================================ FILE: homework/lesson1/chenzidong.md ================================================ 第一课 git到的JS知识 # 初步了解,整体印象。 通过银行开户的类比,把JS运行的流程,一些大家都熟悉的概念,送到大家的认知里。印象最深的是开户窗口,预处理,和执行,对应JS里的 网页窗口,编译器,和执行器。还有流程可以不断优化,以达到最优的解决问题的方案。 #运行环境 在我看来就像基础设施,里面有一些内置或第三方的服务和工具。 #V8引擎 因为JS是一种解析型语言。要边解析边执行,速度就会比较慢。但它服务的对象又是直接面对用户的,要求提高速度,就需要有一种工具来加速把代码和其它数据库整合成机器语言。 #编译器/解释(执行)器 前者把中间文件,解析成机器语言,后者执行机器语言代码。在js的运行环境里,编译器和解释器是合二为一的,边编译边执行。 #内置库/第三方库 运行环境内部的服务/运行环境外部的服务 不同的运行环境,内置服务是不一样的。 #学习JS的方向 先学会习编程的方式解决问题。 然后学会不同工具之间的差异,更好的优化服务。 第一次在浏览器上运行代码并弹出自己名字的对话框,很高兴! ================================================ FILE: homework/lesson1/chenziwen.md ================================================ 1. 类比代码执行流程 + 就是把现实的事件流程抽象出来,用最精简的方式来描述一个事件的执行流程,方便思考,方便转化为代码。 2. 运行环境 + 运行+环境 + 运行:就是执行代码并期望得到想要的结果。 + 环境:就是生存条件,必要条件;也就是代码执行并能返回结果的必要条件。像老师课件里说的婴儿的环境,学生的环境中除了必要条件(爸爸妈妈等)还有资源这类提高生活舒适度的条件,就好比编程中能有更方便,更快捷,更高效的方式提供。 3. V8引擎 + >V8 作为一个 JavaScript 引擎,最初是服役于 Google Chrome 浏览器的。它随着 Chrome 的第一版发布而发布以及开源。现在它除了 Chrome 浏览器,已经有很多其他的使用者了。诸如 NodeJS、MongoDB、CouchDB 等。 V8 使用了直译的方式,即把 JavaScript 代码直接编译成机器码( Machine Code, 有些地方也叫 Native Code ),然后直接交由硬件执行。 与传统的「编译-解析-执行」的流程不同,V8 处理 JavaScript,并没有二进制码或其他的中间码。 简单来说,V8主要工作就是:「把 JavaScript 直译成机器码,然后运行」 + 顾名思义“引擎”就像是汽车的发动机,可以更快的驱动汽车。V8引擎应该能帮助编程者更快的实现编程目标。 + V8引擎比以前的边解释边执行的效率更高。 4. 编译器/解释(执行)器 + > **编译器** 是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快; 而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的. 这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式) 编译是将源程序翻译成可执行的目标代码,翻译与执行是分开的;而解释是对源程序的翻译与执行一次性完成,不生成可存储的目标代码。这只是表象,二者背后的最大区别是:对解释执行而言,程序运行时的控制权在解释器而不在用户程序;对编译执行而言,运行时的控制权在用户程序。 解释具有良好的动态特性和可移植性,比如在解释执行时可以动态改变变量的类型、对程序进行修改以及在程序中插入良好的调试诊断信息等,而将解释器移植到不同的系统上,则程序不用改动就可以在移植了解释器的系统上运行。同时解释器也有很大的缺点,比如执行效率低,占用空间大,因为不仅要给用户程序分配空间,解释器本身也占用了宝贵的系统资源。 5. 内置库 + 内置库JS环境中(浏览器&node.js编程环境中)已经编写好的一些函数方法,可以直接调用而不用重复发明轮子,是提高编程效率的工具之一。 6. 第三方库 + 第三方嘛,应该是相对于内置库来说的。 + 不是当前编程环境中有的,是需要另外添加进来的。 + 第三方库的使用方法还待研究…… 7. 学习JS的方向 1. 学习并熟悉JS编程语言,熟悉语法,学会调用服务(内置库、第三方库)来提高效率。尽快给自己一个正面反馈,加强信心。 2. 理解自己项目的需求,了解并熟悉相关的(重要的)服务。 3. 找不同!比较服务/技术之间的差异,分析其优异性,寻找到最适合自己的方法。 4. JS技术更新变化速度飞快。寻找可复用的经验,加快新技术的学习速度。老师PPT中提到的难度二“无边际”,使我想到avascript无所不能,但要有取舍,要选方向。不能样样了解,样样稀松。 ================================================ FILE: homework/lesson1/cloudyview.md ================================================ 听徐老师的课,感觉从类比入手,体会比自己看书要好多了,理解深入了。 ## 1.类比代码执行流程 代码的执行方式有两种,即解释型语言和编译型语言的的执行方式。 ### 解释型语言的代码执行流程 简单说就是一条一条的执行,看到一句代码,解释一句代码。这个类似于弹钢琴的时候的视奏。视奏基本上就是看一句音符,然后弹出来。 ### 编译型语言的代码执行流程 编译型语言的代码需要先由编译器编译成执行代码,然后再执行。这个类似于点歌,观众点歌,然后乐师根据观众给的曲目,直接弹奏整首曲目。 感觉不是很恰当。现在能想到的是这个。 ## 2. 运行环境 运行环境包括了用于解释程序的引擎(可以是编译/执行方式的,也可以是解释的),以及内置库,第三方库。这些库和引擎核心构成了运行环境。 对于JS来说,有两种运行环境,即WEB浏览器和NODE。对于这两类运行环境,相同的是V8引擎和JS内置对象,其他的库有相当大的不同。 ## 3. V8引擎 V8引擎是JS程序解释和执行的核心。 ## 4. 编译器/解释(执行)器 对于JS这样的解释型语言来说,只有解释器。程序将按照顺序一句句的被执行下去。也就是一边读取,一边解释(理解),一边执行。 对于C这样的编译型语言来说,需要先由编译器将程序变成执行代码,然后再运行。 ## 5. 内置库 内置库是指JS运行环境里面的一组库,这些库是运行环境自带的。 例如,WEB浏览器会自带一组JS的库,如果你的程序只调用了这些内置库的话,就意味着你的程序可以直接在任意的浏览器运行(当前主流浏览器?太古老的可能不一定支持当前的版本)。 ## 6. 第三方库 第三方库不是由JS官方出品的,不会出现在JS的内置库里,即JS的运行环境本身并不带有这些库。如果你需要使用这些库,那么必须安装这些库,才能使用它们提供的服务。 ## 7. 学习JS的方向 三个阶段,入门的时候,必须学会如何调用各类库的方法。 要想提高,就要学会对比和分析不同的库所提供的功能和服务之间的差异,理解这些,以便为自己的业务流程选择适合的库进行编程。 要进一步提高,就要更深刻的理解你所要解决的问题,根据业务的需要来优化编程方法。 ================================================ FILE: homework/lesson1/cuimeng.md ================================================ # 第一次JavaScript课堂总结 > 由于自己在大学期间有过相关的编程语言的学习经历,后来的工作需要也写过一些小程序,本堂课的内容对我来讲理解起来还算相对容易。然而收获依然很大,对编程语言的运行机制有了比较系统的认知。 ## 代码的工作流程 银行开户的流程类比代码的执行过程,让人很容易理解。 JavaScript是一种脚本语言,他的工作原理是解释型的,也就是边编译边执行。这种语言的好处是可以适应多平台的环境,可以不用每移植到一个平台就重新改写代码。通过统一的代码实现各个平台之间的无缝移植和执行。 ## 运行环境 JavaScript的运行环境有浏览器端和node.js的后台端,最初的JavaScript是浏览器运行的脚本语言,后来某位大神把他重新编写,在后台运行发现也非常不错,就有了node.js。 V8引擎是一种常用、高效的JavaScript编译器,可以运行在chrome和node.js。它把JavaScript的代码编译成为执行更高效的机器码。同时可以优化代码,使得编译效率更高。 ## 内置库 JavaScript的内置库分在chrome和node.js上根据功能的不同而有所差异。 内置库是一些预先写好的代码,用来实现一些基本的操作。例如输入输出、数据处理等。通过打包好常用的功能来简化编程的繁琐程度,提高编码效率。 ## 第三方库 是非内置在程序中的,针对某些特定的功能来预先编写好的程序代码,在编程的过程中,需要调用进入程序中来使用,第三方库的使用需要查看document来了解其中不同函数和方法的使用方法和注意事项。 针对不同的编程目的,JavaScript有丰富的第三方库可供使用。具体的工作环境中对第三方库的使用可以参考资深人士的建议。查看GitHub上面的库的受欢迎程度来决定。 ## 学习动力 学习JavaScript使我一直以来的期望,希望能够通过js的学习,让自己进入编程的大门,锻炼编程思维,同时能够通过自己的代码为世界更美好一点作出自己的贡献。 ================================================ FILE: homework/lesson1/cuimiao.md ================================================ #小小白崔淼的学习之路——lesson 1 1. 类比代码执行流程 按照老师的类比,就好像是去银行办卡,先要填写表单(输入代码),然后提交审核(编译器编译),办理业务(执行器执行代码),最终拿卡(反馈结果)。此外,银行还提供了内部服务(内置库),还有第三方公司提供的便捷服务(第三方库)。 2. 运行环境 JS的运行环境分为”浏览器”和”node”,每种运行环境有着不同的内置服务(内置库)和第三方库。这就好比是每个人周边的环境都不一样,有着不同的(有时也有重叠)内置服务和第三方服务。 3. V8引擎 V8引擎为JS语言中负责预处理和执行代码的部分。 4. 编译器/解释(执行)器 应是V8引擎,对代码进行编译和执行。 5. 内置库 每种运行环境中,直接可供应用的内置库。 6. 第三方库 每种运行环境中,外部的可供应用的外部资源库 7. 学习JS的方向 焦点集中在我们写的代码上,我当前的目标就是熟练运用代码,熟练掌握编程语言。 ================================================ FILE: homework/lesson1/dangfeipeng.md ================================================ ### 用类比的方式推导 JS 框架 徐老师用“银行开户流程”的四次改进,由浅入深、层层递进地推导出 JS 框架,通过类比让我们借助熟悉的“银行开会流程”在很短的时间内对陌生的 JS 框架产生了感性认识,了解了主要的组成部分以及各部分之间的关系,形象生动。 ### 运行环境 举个不太恰当的比喻,JS 运行环境就像智能厨房的控制中心,它有各种原材料存储位置以及使用说明(相当于内置对象),也有捡菜、洗菜、切菜、炒菜等基本功能说明(相当于内置库),以及一个菜谱制作器(相当于 V8引擎),一旦收到客户的要求(相当于代码),菜谱编制器就根据客户的要求编制菜肴的加工说明(本地代码),最后厨师机器人根据加工说明将具体食材做成成品菜肴,根据菜肴的基本分类,控制中心又分为中餐和西餐两大类,同时当控制中心的基本功能无法满足客户要求时,比如日料,就可以借助其他第三方来协作完成(相当于第三方库),这其中菜谱编制器是核心,由它来负责整体的运行、控制和调度,可以形象地类比为 V8引擎。 ### 学习 JS 的方向 大致的路线图是: - 学习:掌握编程语言,用编程的方式调用服务来完成你的需求,我的理解是掌握基础知识,包括语法、常用的内置对象; - 提高:了解和掌握重要的服务能力,使其能服务你的业务,我的理解是重点搞清内置库,其次是第三方库; - 进阶:善于比较服务/技术之间的差异,用最好的方式实现你的业务。 ================================================ FILE: homework/lesson1/dengxy0907.md ================================================ 第一次课作业 =========== ### 类比代码执行流程 > 老师通过银行开户流程类比了代码,代码就是一个个功能的体现,一个个具体的功能通过翻译让计算机执行,达到获取结果的目的 ### 运行环境 >运行环境是能够执行代码的环境 ### V8引擎 > 一个运行代码的黑盒子 ### 编译器/解释器 > 一个把代码翻译给机器的东西 ### 内置库 > 一个装有js代码的背包 ### 第三方库 > 一个额外选择的武器库 ### 学习js的方向 > 到这已经完全忘记,对我自己而言,就是通过编辑代码、调用库来实现自己的需求。 ================================================ FILE: homework/lesson1/diaozhicong.md ================================================ #【第一次作业】写一篇总结 ##1. 类比代码执行流程 用银行开户流程的优化类比让我们理解整个代码执行流程,比较形象,也让我们小白更好的理解。另外一点我的感受是,流程图是一个很好的理解工具,未来需要好好打磨。 ##2. 运行环境 运行环境分为Node环境和浏览器环境。 JS的运行环境我们可以理解为一个可以执行代码的黑盒。 ##3. V8引擎 V8引擎是Js运行的核心部分。V8引擎是运行环境中完成编译、解析及执行代码等工作的模块。使得我们编写的易于人们阅读的高级语言代码能够顺利的转换成机器能理解的语言。 ##4. 编译器/解释(执行)器 我们所编写的高级语言,本质上计算机是无法直接执行的,需要通过编译器将其编译成计算机可以识别的代码,类比于说不通语言的两个人需要相互交流,需要一个翻译一样。 目前有两种: **编译型**: 需要一个专门的编译过程,通过编译器翻译成机器 语言。特点:运行效率高。缺点:开发效率低。典型的代表是 C 和 C++等; **解释性**: 一条语句执行的时候才翻译。特点:开发效率高。 缺点:运⾏效率低。典型的如JS等。 ##5. 内置库 编译代码通常是在调用各种内置的库,不同的运行环境的内置库有差别: >浏览器的内置库包含JS内置对象,WebAPI, WebGL, HTTP, WebRTC, canvas等。 >Node内置库包含JS内置对象,Node API等 ##6. 第三方库 第三方库是指由第三方提供的收费或者免费的库。第三方包括公司、个人、开源等。 ##7. 学习JS的方向 通过学习JS,进入编程领域,以后能做一些自己或别人的项目。 学习提高的方向,借鉴老师和同学的总结: > 1. 初学:掌握编程语言,用编程方式调用服务来完成你的需求。 > 2. 提高:了解和掌握重要的服务能力,使其能服务你的业务。 > 3. 进阶:善于比较服务/技术之间的差异性,用最好的方式实现你的业务。 ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-C92092ED-7D5D-41DD-AA7B-2933E01F11F7.png) ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-E702EF21-9151-4C53-9DE8-267C32F7AB60.png) ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-B9F1BC06-DE2B-41C7-80DB-5CE68F869343.png) ================================================ FILE: homework/lesson1/donglili.md ================================================ ## 第一次作业 执行代码就好像去银行办开户业务。本质上就是输入信息、获得结果。 而运行环境相当于银行,就是我们要“办事”的地方,也可以理解我们要执行代码的地方。我们的代码是针对运行环境而写的,只有在运行环境下才能够正确执行。 V8引擎就是完成代码检查和执行的地方,在初始代码经过内置服务库和第三方服务库重新整合代码后,会送入这里执行。 编程语言大致上分为两种,一种是编译型语言,这种是先通过编译器将代码编译成可执行的命令,之后送由执行器执行。他们是统一编译之后在执行,所以开发效率低,因为每改动一些代码都需要重新编译。但相对的通过执行器运行的时候就会快很多。而解释性语言是一条一条的进行,编译一条执行一条,所以它的开发效率高,因为每次做了改动,不需要全部代码都进行编译,相对的,运行效率低,因为每运行一条代码都需要编译一次。 ================================================ FILE: homework/lesson1/duhongxia.md ================================================ 杜红霞第一课总结 1. 类比代码执行流程 用去银行开户这一具体流程类比JS运行环境框架,框架包含: JS运行环境[浏览器运行环境(v8引擎+内置环境)+Nodejs运行环境(v8引擎+内置环境)]—— 第三方库——JS代码 2. 运行环境 包含浏览器运行环境和Nodejs运行环境,JS运行环境如同银行环境,浏览器运行环境和Nodejs运行环 境如同银行中的两类用户的环境 3. V8引擎 核心:用来执行代码 4. 编译器/解释(执行)器** 是V8引擎的组成部分,用来处理和解析代码 5. 内置库 是运行环境所提供的一组服务,用来实现代码的功能 代码首先调用内置库,然后送过去执行,最后给出结果。 浏览器运行环境的内置库: JS内置对象、webAPI、webGL、HTTP、webRTC、canvas NODE运行环境内置库:JS内置对象、Node API 6. 第三方库 付费或开源的各类服务于JS的工具库 浏览器第三方库: Node第三方库: express koa webpack promise 7. 学习JS的方向 有难度:变化快+无边界 学习:用编程方式调用服务来完成你的需求 提高:了解和掌握重要的服务能力,使其能服务你的业务 进阶:善于比较服务/技术之间的差异性,用最好的方式实现自己的业务。 ================================================ FILE: homework/lesson1/fangqingyang.md ================================================ ### JS第一课总结: #### 1运行环境(Nodejs和浏览器) 我们写了一份代码,放到运行环境里面,运行环境为我们提供所需要的各种服务如用V8引擎来执行代码,提供内置库来满足我们的需求等。需要注意的是:JavaScript有两种运行环境,Nodejs和浏览器,这两种运行环境是不同的,就像动物和植物的生长环境的区别。 #### 2 V8引擎 V8引擎属于运行环境的一部分,是运行环境的核心,负责执行我们所写的代码,让代码跑起来,得到我们的结果。 #### 3 内置库 内置库属于运行环境的一部分,为我们提供一系列运行代码所需要的服务。比如:alert() #### 4第三方库 不属于运行环境的一部分,是或由第三方的公司开发,或由个人开发,或收费的,或开源的服务,目的是为更好的满足我们的需求,提供让我们的业务更牛逼,更好的服务,让我们不需要重造轮子。 #### 5 编译器/解释器 编译器:将我们所写的正确的代码,转换成机器能理解的机器代码,让我们的代码变得可执行。 解释器:对我们所写的代码进行这个过程,解释-运行-解释下一行代码-运行下一行代码。。。。,好处是开发速度快,省略了编译这一步,但是运行速度慢了,因为运行时是边解释边执行,不像运行编译好的机器代码一把梭子下去。 #### 6 如何学号JS 1 掌握编程语言,运用编程的方式调用服务来完成自己的需求。(初学者,目前努力的方向) 2 了解和掌握重要的服务能力,使其能够满足自己的业务。(提高) 3 善于比较分析服务/技术之间的差异,用最好的方式实现自己的业务。 (进阶) #### 7 用类比的来推导JS框架 我们(客户)写了代码(申请表),交给运行环境(银行柜台),运行环境里面的编译器(员工A),先审核,检查我们的代码,没问题了将处理好的文件(编译文件)就交给V8引擎(员工B)去执行,期间V8引擎调用内置库里面的服务(比如打印机),或许还有第三方库的服务(比如警察局办证),最后输出一个结果(给我们一个结果) #### 8 代码执行流程 ![](liucheng.jpeg) 首先我们写代码,用编程的方式,按照自己的需求,写要用到什么内置库,什么第三方库的服务,接着交给编译器进行预处理,得到一个编译文件,接着给V8引擎执行,调用内置库,第三方库的服务,然后得出一个结果。 ================================================ FILE: homework/lesson1/fanliao.md ================================================ 新生大学第一次JS课作业 1. 类比代码执行流程 老师以一般的银行开户流程作为例子,类比了我们从代码的输入到编译执行到输出结果,使一个抽象的过程具体的展现在我们眼前。 2. 运行环境 JS运行环境分为浏览器环境和Node环境,不同的环境对应不同的的内置库和第三方库,但内置库中都有JS内置对象。 3. V8引擎 V8引擎是业务核心,是执行部分。 4. 编译器/解释(执行)器 编译型语言的特点是:代码执行考虑高,但是开发效率低;解释性语言代码执行效率低,但是开发效率高。 5. 内置库 内置库就是指不同的运行环境下我们的代码可以调用以实现某些功能的工具。 6. 第三方库 第三方库是有别于内置库的一个开放的外部资源,更好的帮助我们达成目标,它不断更新,不断为我们提供更好的服务。 7. 学习JS的方向 光说不练假把式,学习JS应该多练习,在实践中发现新的收获。 ================================================ FILE: homework/lesson1/fanqing.md ================================================ # 第一课作业 经过好几天逐渐加码的预热练习,JS同学的学习热情都已被调动起来,17年8月8日,我们的第一次正式课开课。 第一课是Javascript的概况讲解课,并同时老师很有心的与初学者进行了学习方法的探讨,对如何利用这门课、该如何学习、该如何提高以及该怎么进阶给出了建议与方向,力求让我们的学习更加高效、更多获益。 开始我的学习与理解~ 对于初期接触编程的人来说,直接讲代码设计流程、执行流程、框架等都太抽象,老师采用了类比的方式进行代码执行流程的讲解,由现实场景引向抽象世界。 ### 以银行开户流程作为类比说明: 有开户需求的客户在银行内使用银行提供的复印、拍照等服务完成申请所需资料准备,提交至银行窗口,窗口服务人员受理后,由负责审查的人员对简单的填写格式、准确性问题进行检查预处理(不是每个银行都如此),预处理检查通过的后,有权限的工作人员核对征信及资格,通过的给予客户发卡,未通过的给予驳回。窗口服务人员的内部工作是整个开户业务的核心部分。对于客户来说只需要与窗口服务人员对接沟通,保证了客户的服务感知。 JS的代码执行流程与之类似,程序员通过调用内置服务功能,编写提交符合业务需求的代码至JS代码执行的核心(V8引擎),内部一系列处理后输出执行结果。 针对不同的客户,还可以区分出普通客户与VIP客户,这时会采用不同的流程——普通柜台以及VIP柜台,也就是不同的业务环境,与之类似,JS也有针对不同类业务需求的不同运行环境。 ### JS的运行环境框架: 运行环境(含两类)、第三方库、JS代码。 #### 两类运行环境分别是: 1.浏览器运行环境;2.Node运行环境。总体看两个环境均由V8引擎(核心)、内置服务、第三方库以及JS代码构成。 为了更好的理解“环境”的概念,同样的,用婴儿与学生的生活环境不同进行类比,有助对于运行环境差异的理解。 细分看两个运行环境,相同在于:均有V8引擎、JS内置对象、JS代码以及某些第三方库,不同在于:其他内置服务库的不同,浏览器运行环境内置库有HTTP、WebAPI等,Node运行环境内置库仅有Node API,以及一些第三方库的不同。 #### V8引擎: 是一个可执行代码的黑盒,它发挥着编译器/解释(执行)器的功能,每条代码在需要执行时都可以进行编译,翻译成机器语言进行执行。相对C、C++等编译型语言(需要整体编译完成后才能执行),开发效率高但运行效率低。 #### 编译器/解释(执行)器: 功能包含分析词法、分析语法、分析语义、优化代码、解释代码、执行代码。JS是解释性语言,以上功能合为一体。编译型语言是将后面的“解释代码”“执行代码”需要提交至单独的执行器来完成。 #### 内置库: 即内置服务库,包含JS内置对象以及其他的内置服务。这些由运行环境内置,基本运行环境启用之后,可以直接调用,就像银行内的复印服务、拍照服务、查询逾期服务等。 #### 第三方库: 是为了提供更便利、更丰富的开发应用功能,类似银行的警务服务、理财公司专柜服务等,就像分工协作的社会,各自发挥所长。在内置库功能不能满足的情况下,我们学会充分运用第三方库,会事半功倍。JS的浏览器运行环境的第三方库有jQuery、Vue、AngularJS、React等,JS的Node运行环境的第三方库有Express、Koa、Webpack、Promise等。 ### 关于学习JS的方向 Javascript是一门无边际的语言,有很多语言是基于Javascript开发出的,有一个说法“JS是编程界的汇编语言”。 对于汇编语言,在校时曾学过,印象中它是与最底层的计算机运行方式对接的语言,按照计算机的运作原理进行编译,涉及寄存器、进栈出栈等。也就是说理解了Javascript语言,其他在她的基础上开发出的语言,是不是也都更容易理解了呢?也许答案是肯定的,若真如此,对于向往编程世界的人来说,更不能错过。 JS的发展变化很快,2009年ES5(ES是JS的便趁个语言规范),至2017年已达ES8,我们现在只需要集中注意力、聚焦在2015年的ES6这个版本,学懂后,对新版本的更新功能也会很容易理解。 ### 要实时关注以下几点: 该怎么学习?——掌握编程语言,用编程方式调用服务来完成我们的需求; 该怎么提高?——了解和掌握重要的服务能力,使其能服务我们的业务; 该怎么进阶?——善于比较服务/技术之间的差异性,用最好的方式实现我们的业务。 Javascript是一门编程语言,就像学习其他语言一样,只有不断的重复、应用,把头脑中的想法,刻意的尝试用她的方式表达出来,才是最佳的学习方法。 #### 如有理解不当处,请老师、同学批评指正! P.S. 课程选的背景音乐太喜欢了,不仅因为歌好听,还因为这首歌兴起的那段时间,2002年,当时我报名参加了一个培训学校的MCSE课程,来回路上,常伴随着这首歌。时隔这么久,现在我再次报名参加与上次本质上很接近的兴趣爱好的学习,在课程中又听到这首歌,很有时光倒流的感觉,非常美好~ 2002年的学习有些懵懂,没能更多的学以致用,希望这一次能学到讲出来、学到用起来~ ================================================ FILE: homework/lesson1/feixiguang.md ================================================ # 第一课总结 ### 1.类比代码执行流程 使用银行开户方式 * 1.填写申请单 * 2.去柜台开户 * 3.发卡 *** 类比一套业务架构: * 开户环境:提供一组服务,该服务包含接受申请、检验申请单信息和核对资格。 (开户环境提供集预处理、执行于一体的核心业务处理单元,同时还提供内置服务方面用户的业务办理。) ``` 内置服务:为满足用户填写订单时提供的一组内部服务。 业务核心:涵盖预处理和执行 预处理:在真正执行开户前进行信息检查的处理过程,以保证执行处理的效率。 执行:执行开户操作的过程,操作完成后并返回想要的开户结果。 ``` * 围绕开户业务,会有一堆第三方服务供用户使用,以满足开户业务的需求。 *** JS运行环境框架: * JS运行环境对应银行开户环境 * JS代码对应用户 * 同样针对JS代码也提供第三方的库,来满足更多的需求。 *** 编译型和解释性差异? * 编译型:需要一个专门的编译过程,通过编译器翻译成机器语言。特定:运行效率高。缺点:开发效率低。 例如:C 、C++ . * 解释性:一条语句执行的时候才翻译。特点:开发效率高。缺点:运行效率低。例如:JavaScript . *** ### 2.运行环境 JavaScript有两种运行环境 * 浏览器运行环境: 基于浏览器的 javascript 前端 JS * Node.js运行环境:基于服务端的 javascript 后端 Node.js 两者语法一样,组成不一样 JavaScript: * ECMAScript(语言基础,如:语法、数据类型结构以及一些内置对象) * DOM(一些操作页面元素的方法) * BOM(一些操作浏览器的方法) Node.js: * ECMAScript(语言基础,如:语法、数据类型结构以及一些内置对象) * OS(操作系统) * file(文件系统) * net(网络系统) * database(数据库) *** ### 3.V8引擎 * V8是Google开发的开源JavaScript引擎。 * JavaScript 引擎的基本工作是把开发人员写的 JavaScript 代码转换成高效、优化的代码, 这样就可以通过浏览器进行解释甚至嵌入到应用中。 [一篇给小白看的 JavaScript 引擎指南](http://web.jobbole.com/84351/) *** ### 4.编译器/解释(执行)器 JavaScript引擎包括: * 编译器。主要工作是将源代码编译成抽象语法树,然后在某些引擎中还包含将抽象语法树转换成字节码。 * 解释器。在某些引擎中,解释器主要是接受字节码,解释执行这个字节码,然后也依赖来及回收机制等。 * JIT工具。一个能够能够JIT的工具,将字节码或者抽象语法树转换成本地代码,当然它也需要依赖牢记。 * 垃圾回收器和分析工具(profiler).负责垃圾回收和收集引擎中的信息,帮助改善引擎的性能和功效。 *** ### 5.内置库 * 浏览器运行环境的内置库包含:JS内置对象、WebAPI、WebGL、WebRTC、HTTP、canvas . * Node.js运行环境内置库包含:JS内置对象、Node API . *** ### 6.第三方库 [JavaScript函数库](https://zh.wikipedia.org/wiki/JavaScript%E5%87%BD%E5%BC%8F%E5%BA%AB) JavaScript 框架(库) JavaScript 高级程序设计(特别是对浏览器差异的复杂处理),通常很困难也很耗时。 为了应对这些调整,许多的 JavaScript (helper) 库应运而生。 这些 JavaScript 库常被称为 JavaScript 框架。 所有这些框架都提供针对常见 JavaScript 任务的函数,包括动画、DOM 操作以及 Ajax 处理。 *** ### 7.学习JS的方向 * "掌握编程语言,用编程方式调用服务来完成你的需求" *** * "了解和掌握重要的服务能力,使其能服务你的业务" *** * "善于比较服务/技术之间的差异性,用最好的方式实现你的业务" ================================================ FILE: homework/lesson1/fengkai.md ================================================ 1.类比代码执行流程 JS运行环境框架类比于银行体系的业务构架; 浏览器运行环境相当于普通用户的开户环境; Nodejs运行环境相当于VIP用户的开发环境; V8引擎相当于银行的业务核心; 内置库=内置服务; 第三方库相当于第三方服务; JS代码相当于用户。 2.运行环境 提供集预处理、执行于一体的核心业务处理单元,同时还提供内置服务。 3.V8引擎 计算黑箱 4.编译器/解释(执行)器 一边编译一边解释,解释性语言,开发效率高,运行效率低。 5.内置库 系统内置封装的代码 6.第三方库 外部调用的封装代码 7.学习JS的方向 web前端开发 ================================================ FILE: homework/lesson1/hanmeng.md ================================================ Javascript第一课总结 1. 类比代码执行流程 首先,老师运用“银行开户流程”类比了代码执行流程 银行这大环境类比JavaScript,在银行的大环境中有普通用户环境和VIP用户开户环境,分别对应了JavaScript环境中的浏览器运行环境和nodejs运行环境 他们都有两部分组成V8引擎和内置服务,分别提供最满足各自的需求。另外,还有有第三方库,为浏览器的运行环境和nodejs的运行环境同时提供第三方服务代码。 2. 运行环境 JavaScript的运行环境包括浏览器运行环境和nodejs运行环境,在这两运行环境中都有V8引擎和内置库,在我们写代码的时候,学会用代码调用不的内置库是关键, 完全不用考虑V8引擎的工作。 3. V8引擎 对代码进行预处理,处理,执行。我们只用知道V8引擎是编译解析执行代码的就可以了,作为菜鸟不需要知道它的内部工作原理。 4. 编译器/解释(执行)器 V8引擎的组成部分,编译执行我们创造的代码,Javacript是一种解释型语言,就是编译执行一起执行。 5. 内置库 运行环境的各种打包的服务,让我们通过代码调用,实现不同的功能 6. 第三方库 由第三方公司或个人提供的不同功能的代码库,供我们使用以实现更好,更帅的功能。 7. 学习JS的方向 重点来了,深刻理解记住这几句话: 作为小白你应该“掌握编程语言,用编程的方式调用服务来完成你的需求”,掌握语言,把基础打牢固。 提供阶段的你“了解好掌握重要的服务能力,使其能服务你的业务”,主要掌握各种库的功能 进阶阶段的您“善于比较服务/技术之间的差异性,用最好的方式实现你的业务。”,比较,思考,找出最好的方式实现你的业务。 8.学习的难度 变化快,我们要聚焦重点 ES6 无边际 创造能力无限,空间无限大 ================================================ FILE: homework/lesson1/hanwei.md ================================================ ## 第一次作业 执行代码就好像去银行办开户业务。本质上就是输入信息、获得结果。 而运行环境相当于银行,就是我们要“办事”的地方,也可以理解我们要执行代码的地方。我们的代码是针对运行环境而写的,只有在运行环境下才能够正确执行。 我们编写的代码就好像是提交的表单,然后获得开户的结果就相当于程序执行的结果。在我们提交表单后银行会审核我们的信息填写格式还有内容是否正确,这就类似于要执行程序前,运行环境会对代码的格式和内容进行检查,包括词法、语法、语义等等。在我们的表单审核合格后,银行会进入开户流程,如果符合开户的条件就能顺利开户。代码也是一样,在确认代码填写正确后,程序就会开始执行代码。如果代码编写符合实际情况,则能够顺利执行。 V8引擎就是完成代码检查和执行的地方,在初始代码经过内置服务库和第三方服务库重新整合代码后,会送入这里执行。在这个过程中,银行会提高填写表单的一些服务,如拍照、信息查询等等这些服务提高用户的办事效率,把用户需要做的一些事情集中了起来。在代码里,这就相当于内置服务库,他把一些功能提前整合好了,用户只需要调用就可以,不需要重新写。此外,类似的还有第三方库,他们也是提供了整合服务,只不过不是由银行或者运行环境提供的, 在银行的开户流程就好像是到房管局查资产证明之类的,而在代码里是通过接口调用来实现的。内置服务库、V8引擎还有提供第三方库构成了完整的JS的运行环境。 编程语言大致上分为两种,一种是编译型语言,这种是先通过编译器将代码编译成可执行的命令,之后送由执行器执行。他们是统一编译之后在执行,所以开发效率低,因为每改动一些代码都需要重新编译。但相对的通过执行器运行的时候就会快很多。而解释性语言是一条一条的进行,编译一条执行一条,所以它的开发效率高,因为每次做了改动,不需要全部代码都进行编译,相对的,运行效率低,因为每运行一条代码都需要编译一次。 从这里可以看出,其实V8引擎做的事情和我们关系不大,我们要做的就是写好代码、用好库。所以学习的方向也是按这个顺序来,基本的先写好基本的代码,之后会使用内置服务库、学会使用第三方库,再之后懂得比较挑选合适的库来最优的完成任务,最后可以自己写开发库、做出以前没有人提供过的功能,再进阶的话就是了解V8引擎的工作原理还有机器码等等。 ================================================ FILE: homework/lesson1/haohu.md ================================================ ###1. 类比代码执行流程 代码 + 库(内置库&第三方库) -> 运行环境(浏览器 or NodeJS) -> 执行结果 种子 + 养分(水&阳光空气) -> 土壤 -> 大树 ###2. 运行环境 可能不准,但能帮助理解: - 电脑硬件是操作系统的运行环境 - 操作系统是应用软件的运行环境 - EXCEL 是 .xls 的运行环境 - flash player 是 ActionScript 的运行环境 - Adobe Air 也是 ActionScript 的运行环境 - 浏览器 是 JS 的运行环境 - NodeJS 也是 JS 的运行环境 - JVM 是 Java 的运行环境 ###3. V8引擎 - Google 出的、高效的JS解释(执行)器 ###4. 编译器/解释(执行)器 - 编译器 是翻译,翻译完了之后你去阅读 - 解释器 是口译,一边翻译一边就说出来 ###5. 内置库 - JavaScript 的官方库,一般是用以实现普遍性的底层的需求 ###6. 第三方库 - 非 JS 官方库,一般是用以实现某垂直、细分领域的需求 ###7. 学习JS的方向 - 万向 ================================================ FILE: homework/lesson1/hewei.md ================================================ # 第一次作业 - 讲座总结 ## 流程优化,事半功倍 徐老师一开始先用`设计银行开户流程`的方式,来**类比代码执行流程**。 笑来老师就说过,一个得体的比喻,可以让人很好地理解一个之前并不了解的概念。 徐老师通过不断地优化银行开户流程,让大家看到了如何改进一个框架的设计,以及因此而带来的效率的提升。 四次的流程优化,将个人和银行(即不同的模块)原本繁琐、重复的任务,进行功能上的不断细分,从而实现更好的模块化——抽离出常用的功能,单独作为内置服务;将预处理和执行模块分离开来,降低耦合;将银行的操作封装成接口,用户只需通过窗口进行输入,然后对窗口的输出进行反馈即可。 > 这只是自己目前对这个流程优化设计的理解,相信经过自己不断的学习,会理解得越来越深刻。就像徐老师说的,做项目不在于多,要在于精。只做一次项目的收获,就能超过别人做好几个项目的收获,这样的项目做得才是最有效果的。 ## 运行环境 用一个不是很到位的比喻来说,**运行环境**就相当于饭馆: 浏览器运行环境相当于饭馆的前厅,Node运行环境相当于饭馆的后厨。 前厅和后厨都有必需的基础设施:水、电,等等,这个可以近似地类比为JS运行环境中的V8引擎。 而前厅和后厨还有各自不同的特色设施:前厅的桌椅,餐具区,茶水区等等,后厨则是做饭的各种区域。这两者可类比为浏览器和Node运行环境的内置服务。 第三方库,则是饭馆本职工作之外的服务,比如火锅店提供的美甲服务,就是这种情况。 ## V8引擎 V8引擎直接将JavaScript代码编译成机器码——所以不管是前端环境比如Chrome浏览器,还是后端环境如Node.js,都有它在背后默默撑起一片天。 接着用前面饭馆的类比方式:不管是前厅还是后厨,水、电等基础设施都是以相同的方式使用的。不会因为是前厅或者后厨,而有所不同。 ## 编译器/解释器 编译器可以类比为中餐的制作过程:我要吃鱼香肉丝,那就需要先备好食材,然后下锅开炒,最后盛到盘子里,供用户享用。 而解释器,可以理解为自助餐:每次只可以要一种食品,吃完了再拿,不能多拿,不能不拿,直到不想吃为止。 ## 内置库 内置库可以理解为各种常见需求的便捷实现方式:想要煮个鸡蛋?好,给你个煮蛋器,分分钟煮好鸡蛋。想要让暂时不吃的食物保鲜?好,放进冰箱,用的时候再拿出来。没有这些工具的时候呢?要煮鸡蛋,自己支起一口锅,慢慢烧水,水烧开了把鸡蛋放进去,看着表,时间到了说明应该煮熟了,然后才拿出来,多麻烦啊! ## 第三方库 唔,写到这里了,怎么感觉上面内置库的理解方式不太对?明天再反刍一下。 ## 学习JS的方向 学习一门语言,语法、框架还是次要的。更重要的,是学会其背后的思想,学会其解决问题的思想。 就像笑来老师,用计算机的思想来类比实际的生活,非常精彩的类比方式! 除此之外,合理的利用各种服务、资源也是非常重要的。 不管是初创企业,还是自己写代码做一些小东西,合理的节约时间和金钱成本也是很必要的。而且利用现有的成熟的服务,可以让我们把更多的精力放在更重要的事情上——实现自己的想法中的关键部分。 比如想做一个博客,主要目的是分享自己的知识,那么完全靠自己写代码实现博客的前后台功能就不是那么的有必要了。找一个合适的博客程序,自己一边写作一边修改,更符合主要的需求。 解决问题的时候,一定要抓住**最重要的**那个因素,优先去解决。就像做饭,好吃、好看不是最重要的,最重要的,是先把饭做熟! ================================================ FILE: homework/lesson1/huangjiashu.md ================================================ ## 写一篇总结 听完课,感受还是颇深的,老师讲的还不错,我觉得最好的就是接待代码如何运作的那个图,就是在ppt中多次提到的那张图。下面试根据老师的提示写的总结 ![流程图](liucheng.jpeg) ### 类比代码执行流程 老师拿银行开户的流程类比代码执行流程,还是很恰当的。 由简单的 输入 执行 和 输出。扩展到 运行环境,内置服务和第三方库。类比我觉得很好,也很容易理解。 我觉得也没啥问题,但总感觉在开户流程中,任何一个环节出错了,都会反馈到用户。在第三第四次升级中,我似乎并未体看到这一点。这一点应该可以类比为程序中出现的错误处理或者抛出异常吧。 ### 运行环境 这里的运行环境,应该就是代码的执行环境。类比人所生活的环境,代码运行也处在一定的环境中的。 老师提到 JavaScript的运行环境有两种,一种是浏览器,一种是node环境。如同人类的生存环境 比如说地球吧,为人类提供光照,食物 和 水等必要的生存条件,JavaScript的运行环境也为JavaScript代码的执行提供必要的条件支持,比如V8引擎,比如内置服务等。 ### V8引擎 > V8是一个由美国Google开发的开源JavaScript引擎 > 在运行JavaScript之前,相比其它的JavaScript的引擎转换成字节码或解释执行,V8将其编译成原生机器码(IA-32, x86-64, ARM, or MIPS CPUs),并且使用了如内联缓存(inline caching)等方法来提高性能。 由此可见,V8引擎大大提高了JavaScript代码的执行速度,所为引擎就类比汽车的发动机,V8印象中指的也是发动机(8缸发动机,在汽车运行中可以提供更大动力),估计V8引擎也是这么来的吧。当然只是个人臆测。 ### 编译器/解释(执行)器 老师已经讲到,JavaScript是解释型语言,没有明显的编译行为。 而一般的C,C++,Objective-C 等都是编译型语言,其特点是有明显的编译过程。先编译,编译通过后才执行。 而诸如JavaScript解释型语言一般是边编译边执行。 编译器就是将写的代码(通常是高级语言,更接近自然语言)编译成机器能读的懂的机器语言。 > 一个现代的编译器的主要工作流程:源代码 - 预处理 - 编译器 - 目标代码 - 连接器 - 可执行程序。 执行器 就是直接执行编译过的代码文件 ### 内置库 内置库 通常都是环境自带的内置服务,提供开发所需的基本功能,包括基本的数据结构,模块,函数等。 ### 第三方库 第三方库通常是提供一套接口,供开发者使用,而这些接口通常已经实现了许多功能,只需要开发者简单的配置开发即可实现自己的业务需求,也就是说第三方库的很大一个作用就是提高开发效率。即拿来主义。站在巨人的肩膀上进行开发,相比于自己从头做起,当然是事半功倍。 下面是老师给的建议: > 第三方库一般是同种语言开发的拓展功能,以满足多样化的需求。 当然不排除会用其他语言开发第三方库,供JS语言编写的代码调用。 比如: 用C 语音写一个高级算法(因为C语言效率更高),然后开放接口给JS调用。那么这个接口要满足JS语言对C语言的调用规范。 即:两种不同语言之间的调用,要满足一定的规范。这种规范一般只要这两种语言相互认可即可。 Python和C之间的调用又会有他们自己的规范。 在大多数情况下,JS不太会用到其他语言的开放库。在学习过程中只聚焦在JS的第三方库即可! ### 学习JS的方向 想作为一个开发人员,有时候单一的了解前端或者后端是远远不够的,我学习的JS方向是希望既了解前端又了解后端。 并能独立完成开发简单的开发任务。 ================================================ FILE: homework/lesson1/huangqi.md ================================================ ## 总结 ## **2017年8月8日**我跟随老师学习了JavaScript的第一节课,认识了几个概念:“JavaScript的运行环境、V8引擎、编译器、执行器、内置库、第三方库” ,还有一个类比代码执行流程,也打开了我从JavaScript的小小白走向JavaScript菜鸟的大门。 **代码执行流程** 老师生动的用了一个银行开户的类比,让我们知道了代码的执行流程,类比中,我们编写的代码就是一个开户申请单,我们把这个申请单(代码)交给银行(运行环境),银行(运行环境)方面就对这个申请单检查(编译器编译)和执行(执行器),最后返还结果给我们。 **运行环境** 运行环境,就是一个能够使代码调用内置服务的一个环境,里面包含了两个小运行环境;一个是浏览器运行环境,另外一个就是nodejs运行环境。 **V8引擎** 对我们的代码进行预处理和执行的一个黑盒子。 **编译器/解释(执行)器** 一个对我们编写的代码进行翻译的工具,执行器就是对编译器解释完的代码进行执行。 **内置库** 一个支撑各自的业务而设定的库,而且必不可少的。 **第三方库** 支持我们把业务做得更好,更漂亮的库。 **学习JS的方向** 紧跟老师的步伐,和研究JavaScript权威指南,掌握JS编程语言,并用编程的方式调用服务来完成自己的需求。 ================================================ FILE: homework/lesson1/huangxiaohui.md ================================================  javascript第一节课总结 1.1.类比代码执行流程 以银行开户流程为例,将优化后银行开户流程——分为普通用户和VIN用户两大业务模块,类比JS的浏览器和NodeJS这两种运行环境下,代码调用内 置库进行进行编写完成后输入到运行环境进行编译后,再输出到CPU进行执行的流程。 2.运行环境 相对JS来说,由内置库和V8引擎等模块组成的浏览器和Node运行环境 3.V8引擎 对代码编译后,并执行代码的核心 4.编译器/解释(执行)器 V8引擎中对代码进行编译和执行的一个模块 5.内置库 由浏览器和Node内置提供给编写代码的一些功能 6.第三方库 由浏览器和Node两个运行环境以外的第三方提供编写代码的附加功能 7、学习JS的方向 掌握以老师教的ES6编程语言 ================================================ FILE: homework/lesson1/huangzhihua.md ================================================ # JavaScript 第一课作业 总结——黄志华 运用下面这些关键词,把你知道的写出来。 1. 类比代码执行流程 2. 运行环境 3. V8引擎 4. 编译器/解释(执行)器 5. 内置库 6. 第三方库 7. 学习JS的方向 1,代码的执行过程,就像是银行开户流程一样: a,首先需要一个运行环境“银行营业厅”。(比如node) b,然后用户通过“填写表单等方式”,输入(提交)信息。 c,客户的“表格”通过“窗口”传递到“业务员”进行审查,如果不通过着“驳回”。(编译器) d,当“业务员”审查你的表格没有问题,就会帮你进行业务办理操作(解释器/执行)。 e,“业务员”办理完业务之后,就会返回一个结果给客户——“您的业务已办理完毕”。 2,Node是JavaScript的运行环境,浏览器也是JavaScript的运行环境。 一个程序要跑起来,就必须有一个运行环境,相当于一个基础设施,比如说我想要游泳,那么就必须到一个有足够深的水池里进行游泳。 又比如说声音的传播需要介质,在真空中就缺乏这样的”运行环境“,所以真空中无法传递声音。 3,V8引擎: 相当于把一系列复杂的“编译器/解释(执行)器”都打包成一个黑匣子。 这样在编写代码的时候,就会简单很多,这相当于把一些繁琐重复的工作,交给了程序进行内置处理,极大的提高了编程效率。 4,内置库与第三方库: 内置库就是“原生应用app”,自带的一些基础功能库,只保留最重要的部分,这样有利于代码运行的速度与兼容性。 第三方库,在内置库的基础上写代码,有时候会遇到一些特别需求,这时候引入相关的第三方库就可以让代码流程得到极大的简化,有利于编写难度降低。 第三方库的调用,有时候会发现,库中有库,第三方库自己也调用了部分第三方库。这带来一种特别的优势,那就是别人做的很好的事情,比如某一种函数的编写,我们直接调用就可以了,不需要重新再编写一遍,我只需要做我最擅长的与最重要的事情就可以了。 5,学习JS的方向: 我的主要目的是为了可以独立编写一些小程序,比如说微信的小程序,或者是某种轻量的app。 我的英语几乎是零基础,所以也想借编程的这个机会,去实际运用英语,这样最起码我可以有一个比较特别运用英语的环境,为我之后补英语打一个基础。 学习JS未来不一定是一个专业的程序员,但我懂得一点编程技术,可以让我在很多领域里有一个特色技能,并且编程思维是一种非常好的思维锻炼方式,这可以与我的其他能力产生复合效果。 ================================================ FILE: homework/lesson1/huxiaodan.md ================================================ ## 1.类比代码执行流程 类比银行开户流程。用户向银行开户环境提交申请,银行通过内置服务、预处理和执行后,将结果反馈给用户。 ## 2. 运行环境 运行环境提供集预处理、执行于一体的核心业务处理单元,同时还提供内置服务方面用户的业务办理。 JS运行环境有浏览器运行环境和Node运行环境。 ## 3. V8引擎 V8引擎是指对代码进行预处理和执行。 ## 4. 编译器/解释(执行)器 编译器对代码进行词法、语法和语义的分析,以及优化代码。 解释(执行)器对代码进行解释和执行。 ## 5. 内置库 内置库是一组内部服务。 浏览器的内置库有JS内置对象、WebAPI、WebGL、HTTP、WebRTC、canvas等。 Node的内置库有JS内置对象、Node API等。 ## 6. 第三方库 第三方库是由其他机构或个人编写的,有助于开发的服务。 浏览器的第三方库有jQuery、Vue、AngularJS、React等。 Node的第三方库有Express、Koa、Webpack、Promise等。 ## 7. 学习JS的方向 学习JS,前端和后端都可以完成。要了解自己学习的语言,熟练掌握内置库和第三方库,用最恰当的服务实现业务。 ================================================ FILE: homework/lesson1/huyong.md ================================================ 编程第一课总结 #内容分为三个部分 ##第一部分是对与之前预习作业的回顾,点出了大家在写代码的时候常犯的一些错误,比如写代码的时候, 需要用全英文的书写格式,尤其是像引号顿号等的使用 ##第二部分是代码学习的引导和未来的路如何走,开头给了我们一个整个编程学习的准则就是”干“, 然后通过银行的开户流程类比来代码输入得到结果,给出了运行环境:包括浏览器和nd.js的运行环境, 环境,在介绍这俩个环境的时候给出了编译器和解释器,对于环境我们就可以看待成一个黑盒, 不用管他如何执行,我们只需要写出正确的代码,然后检验自己的代码,然后通过内置服务的区别 讲解了浏览器和nd的区别,同样的代码在不同的环境下是得出不同的结果的,无论是浏览器和nd 都有着js内置库,然后给出了第三方库的解释,最后进行了演示。 ##第三部分,我们学习编程之后的路该 如何走,分为三步走,第一步学习,掌握编程语言,用编程 方式调用服务来完成你的需求,第二步提高,了解和掌握重要的服务能力,使其能服务你的业务: 需要对内置库和第三方库有一个深入的了解,第三步进阶,善于比较 服务/技术之间的差异性,用最好的方式实现你的业务,就是比较各种库的差异性,选出最适合你业务的库, ================================================ FILE: homework/lesson1/ianyang.md ================================================ 【第一次作业】写一篇总结 1. 类比代码执行流程 老师以银行开户流程为类比,也可套用其他服务型行业的标准流程,比如物流、零售。这个类比让我认识到,从输入代码到编译执行到输出结果,不仅是商业社会的具体运作方式,也可类比人与人的沟通模式,难怪有“人机对话”这样的比喻。 2. 运行环境 JAVA的运行环境便是指一套完整服务方案的构成要素,它们相互之间有序列也有逻辑和因果关系。其中第三方服务类比的代码库非常关键,这位整个代码进入应用实现了无边无际的拓展性。 而运行环境必须分清是在浏览器环境还是Node环境下,因对应的内置库是独立的。 3. V8引擎 便是业务核心,我的理解,也就是最终要实现的功能。 4. 编译器/解释(执行)器 指C++这类更底层的语言通过编译器与执行器的分离,实现了高运行效率但影响开发效率;解释器则反之; Java语言是通过混合了编译器与解释器来执行代码,这样一个黑盒子究竟如何解释语言不重要,重要的是理解它会如何执行出我们想要的结果,即实现功能。 5. 内置库 内置库是指在不同的运行环境下所内置的不同的可调用实现对应功能的现有代码库(不知这么理解对不对?) 6. 第三方库 第三方库一直会有更新,是开源代码工作者们的集体智慧和贡献(对吗?),而熟悉某一个第三方库能大大帮助我们根据需要实现的功能来选择最合适的库。 7. 学习JS的方向 不需要追求新版本;动手干,边写边练,实践是王道。 ================================================ FILE: homework/lesson1/jaychen.md ================================================ # HW1 Lesson1总结 ## 1. 类比代码执行流程 老师用银行户流程的类比让我瞬间明白了代码执行流程,开场非常精彩!我们输入代码后,调用了内置服务和第三方库对代码进行处理,再把结果喂给核心业务,核心业务类似于黑盒对代码进行预处理执行,相当于银行开户业务中的预处理和审批流程,最终将结果输出。 ## 2. 运行环境 运行环境是为了保障相应业务的运行而所需要的必要资源,不同业务有不同的需求,所以他们的运行环境是截然不同的。针对不同的业务对象,要明确他们环境的差异。 ## 3. V8引擎 V8引擎像一个黑盒子,对输入的代码进行预处理和执行(编译器/解释器),在初学阶段,没有必要对V8引擎过多在意。JS的前端和服务器端开发环境,都由V8引擎进行核心业务处理。 ## 4. 编译器/解释(执行)器 经过编译器编译(相当于银行开户中的预处理)的代码,进入解释器(相当于银行开户重的执行),成为机器可以识别处理的code。有些语言把编译和执行分为明显的两个阶段(如C、C++),这样执行很有效率,但不利于程序员写代码;有些语言把输入的代码直接一条条完成编译和执行的整个过程(JS),这样开发很有效率,但不利于执行。两种处理方式在使用时各有利弊。 ## 5. 内置库 内置库是为了运行相关程序而预先设置好的可以方便进行各种调用的各种模版框架。 ## 6. 第三方库 第三方库是对内置库的补充,是由第三方提供的为了方便程序员对功能实现而能随时调用的框架。 ## 7. 学习JS的方向 要想在JS的学习上持续精进,需要在学习了基础知识和熟悉了各种库的调用后,能够体会掌握各种不同的库在使用方面的细微差别,才能更灵活地使用合适的库进行开发,成为一名高手。 ================================================ FILE: homework/lesson1/jianglin.md ================================================ 1. 类比代码执行流程:代码执行流程就像银行开户,要先确认信息准确(编译)再进行开户操作(执行),对于JavaScript,是边编译边执行,易开发难执行;对于C/C++,是先编译后执行,难开发易执行。 2. 运行环境:运行环境是代码的环境,有各种服务,就像我们生活的环境,也可以区分成各种服务。这个概念要在编程中进一步理解。 3. V8引擎:V8引擎是运行环境的一部分,是用来执行代码的。 4. 编译器/解释(执行)器 :编译器+解释(执行)器是V8引擎的两个功能,具体的原理现在不了解。 5. 内置库:运行环境本身提供的服务。 6. 第三方库:第三方公司等提供的数量庞大的库,可供使用。 7. 学习JS的方向:关于编程,上学时接触过C++和汇编,毕业后再没有过应用。这次学习JavaScript是当做小白学习,一定要专注,专注于老师的任务,网络的内容偶尔可以看看,切勿沉迷于最新的库/信息等。就像上学时学习制图,最重要的是如何制图的原理,而不是纠结于用什么软件来画图,所以初学的时候,图板和CAD04才是最好的朋友。在有一定基础之后,再研究其他的库和已经学习的库有什么区别,逐步掌握更广泛更深入的应用。 ================================================ FILE: homework/lesson1/langjianjun.md ================================================ 第一节课总结 1. 类比代码执行流程 用人去饭店吃饭做类比:饭店类似于软件的运行环境,客人从菜谱上点菜相当于输入某些指令,自动化的点菜系统类似于V8引擎,而厨师则是编译器/解释器,根据菜单做菜相当于执行一系列的程序包,这些程序包属于内置库的一部分,一些秘制的作料或半成品等属于另一部分的内置库;有些酒水菜品等是外购的,相当于第三方库。最终端到客人面前的饭菜是输出。我知道这个类比很粗糙,但要从日常生活中找出一个和程序执行高度相仿的例子来做类比好像也不是很容易。 2. 运行环境 JS的运行环境有浏览器和Node。我去年年底自学JS时只知道有浏览器,Node对我来说是一个完全陌生的环境。 3. V8引擎 JS的引擎,google研发的,最早用于chrome浏览器上,功能强大,号称使JS的运行速度堪比二进制代码。可以独立运行,也可嵌入任何C++程序中。 4. 编译器/解释(执行)器 机器只能识别二进制语言,而人类适合操作的还是类似自然语言的编程语言。因此需要有执行将编程语言转化成二进制语言的工具,这就是编译器或解释器。这转化又有两种方式,一种是高级语言,可执行程序是将源程序编译后形成的,有点精加工食品的感觉,你无法从蛋糕中看出原材料的样子;另一种是脚本语言,就是JS这种的,代码是一行一行边解释边执行的,不会转换成人类无法识别的可执行程序,就像煮玉米或者烤串,你能看懂原料是什么。 5. 内置库 预先编辑好的执行特定功能的模块,因为是随着运行环境提供的,所以叫内置库。 6. 第三方库 由第三方提供的某些特殊模块。 7. 学习JS的方向 想提高自己的自由度和解决问题的能力吧,也想看看40多岁的人能玩会哪些新东西。 ================================================ FILE: homework/lesson1/leizhen.md ================================================ 用银行开户流程类比代码执行过程,通过细分项目和需求,一步一步优化流程,来完成一个完整的框架结构。 我用炒菜的过程来说明我对几个概念的理解(我想了很久,但还是不够贴切) 厨房是一个大的集合:【锅, 燃气灶, 调味料, 食材, 道具, 砧板, etc 】 运行环境:最大的载体,这是最基本的工具。做不同的菜就要用不同的锅一样。煎东西要用平底锅,炒菜的话,就用最平常的大锅子。浏览器运行环境和NodeJS运行环境我觉得和这个比喻类似。 V8引擎:核心部件。类比燃气灶上要点火一样,对食物进行加热(这是核心工具) 内置库:一开始就包含的最基本的东西,管你用不用都在那里。比如:调味料。做菜就是为了好吃啊,为了追求菜的原汁原味,也可以不用的 第三方库:不是必需的,但有的话会很方便。做菜有火就行了,但以前的烧柴火做菜,和现在的天然气做菜。肯定是现在更方便啊! 编译器/解释器:切菜和炒菜的过程就像编译器,炒菜的过程就像解释器。先把一个食材处理好,才好进行下一步的炒菜。而炒菜的过程就简单多了,直接炒就好了,不用处理食材。JS像炒菜的过程,没有切菜直接丢进锅里,当然开发效率高,运行效率低了嘛。 学习JS的方向:我觉得就和做新菜一样。在了解的基本的炒菜过程后(基础),就去多看看别人的菜谱,把菜fork到自己的锅里,自己试一试,味道做得不错了,就可以按照当地人的口味自己进行魔改了。该多了就会对味道有了更深入的了解了。JS也应该差不多,多看看别人的项目,copy/paste 没有提高的。 ================================================ FILE: homework/lesson1/lichen.md ================================================ # 总结 ### 一、引言 #### 1、运用类比:设计一个银行开户流程 ![](https://ws4.sinaimg.cn/large/006tNc79gy1fickuh8bf3j30q40ejtad.jpg) #### 2、流程优化的演进 ![](https://ws3.sinaimg.cn/large/006tNc79gy1fickvodl3ij30q30fpmz7.jpg) ![](https://ws4.sinaimg.cn/large/006tNc79gy1fickxg5rsvj30q00fk768.jpg) ![](https://ws3.sinaimg.cn/large/006tNc79gy1fickyk1rt2j30o10ejq4n.jpg) ![](https://ws3.sinaimg.cn/large/006tNc79gy1fickzk3qoej30pg0g4jth.jpg) #### 3、开户流程总结 ![](https://ws4.sinaimg.cn/large/006tNc79gy1ficl1jknppj30jk0flq4z.jpg) -![](https://ws2.sinaimg.cn/large/006tNc79gy1ficl3eh1byj30mv0fxdi9.jpg) ![](https://ws2.sinaimg.cn/large/006tNc79gy1ficl50k3enj30n30fmabp.jpg) ![](https://ws4.sinaimg.cn/large/006tNc79ly1ficl71nxv2j30ll0ewmyu.jpg) ![](https://ws1.sinaimg.cn/large/006tNc79gy1ficl8g30p1j30ks07d3za.jpg) ### 二、JavaScript是什么? ![](https://ws1.sinaimg.cn/large/006tNc79gy1ficlau9b99j30n20fqabw.jpg) ![](https://ws4.sinaimg.cn/large/006tNc79gy1ficlbj2t8cj30of0f4tah.jpg) ![](https://ws2.sinaimg.cn/large/006tNc79gy1ficldgxbslj30pb0dr75z.jpg) ![](https://ws1.sinaimg.cn/large/006tNc79gy1ficlet21k2j30l80cr3zw.jpg) ![](https://ws1.sinaimg.cn/large/006tNc79gy1ficlh78qxwj30oa0fetac.jpg) ![](https://ws3.sinaimg.cn/large/006tNc79gy1ficli6uj27j30p90egt9y.jpg) ![](https://ws3.sinaimg.cn/large/006tNc79gy1ficlizv33nj30pt0dnmys.jpg) ### 1、运行环境 #### 类比 ![](https://ws3.sinaimg.cn/large/006tNc79gy1ficlkyz1qzj30f70cy754.jpg) ![](https://ws3.sinaimg.cn/large/006tNc79ly1ficlmh4s69j30lo09m3zw.jpg) ![](https://ws1.sinaimg.cn/large/006tNc79ly1ficlo8l6u8j30m50ffgnk.jpg) ![](https://ws1.sinaimg.cn/large/006tNc79ly1ficlq4mfjhj30ma0f3myr.jpg) ### 2、概念 ![](https://ws1.sinaimg.cn/large/006tNc79gy1ficltjmh0yj30iq0drjrw.jpg) ##### (附注:V8引擎是用来处理代码的) ### 3、运行演示 #### 调用inspect ![](https://ws3.sinaimg.cn/large/006tNc79gy1ficlv2waaqj30ly0cvaau.jpg) ![](https://ws4.sinaimg.cn/large/006tNc79gy1ficlyuwbubj30l80dawfi.jpg) #### 警告实验 ![](https://ws1.sinaimg.cn/large/006tNc79gy1ficm1o1fu0j30n30jkq4r.jpg) #### 4-1、JavaScript该怎么学 ![](https://ws4.sinaimg.cn/large/006tNc79gy1ficm69jb1hj30l90azab2.jpg) #### 4-2、该怎么提高 ![](https://ws1.sinaimg.cn/large/006tNc79gy1ficm8csco4j30h802kaa7.jpg) #### 4-3、该怎么进阶 ![](https://ws1.sinaimg.cn/large/006tNc79gy1ficm9n7l2qj30h902lwep.jpg) ![](https://ws4.sinaimg.cn/large/006tNc79gy1ficmcfitpvj30ln09kt9f.jpg) ##### (附注:我们不要由软件的变化去变化) ![](https://ws4.sinaimg.cn/large/006tNc79gy1ficme3xtipj30if0c1my0.jpg) ##### (附注:由js语言创造出来的语言有上百种) ### 三、总结 ![](https://ws3.sinaimg.cn/large/006tNc79gy1ficmfo4mhmj30hd0cq3yx.jpg) ##### 【注意】 ##### ES是JS编程语言的规范 ##### 运行环境包含V8引擎,同时提供内部内置服务 ##### Node是运行环境 ### 四、代码演进 ![](https://ws4.sinaimg.cn/large/006tNc79gy1ficmtw28qkj30ig0ddmy7.jpg) ![](https://ws2.sinaimg.cn/large/006tNc79gy1ficmv1fw6nj30i50caab7.jpg) ================================================ FILE: homework/lesson1/linchunlong.md ================================================ 运用下面这些关键词,把知道的写出来:

1. 类比代码执行流程

2. 运行环境

3. V8引擎

4. 编译器/解释(执行)器

5. 内置库

6. 第三方库

7. 学习JS的方向 **

我的总结是:**

1. 在银行办理开户的流程类比代码执行流程,开户流程有两个主体:个人、银行。个人相当于用户请求服务,银行相当于数据处理的业务环境。用户请出服务请求后,银行根据用户提供的数据,在业务环境中进行处理,并向用户返回处理结果。

2. JS运行环境框架,包括JS运行环境(浏览器运行环境和nodejs环境)、第三方库、JS代码。JS代码,需要放在JS代码的运行环境中执行。

3. V8引擎,内置在JS浏览器运行环境和nodejs运行环境中的处理器。

4. 编译型语言的代码有一个专门的编译过程,可以直接被机器读取语并执行,编译是指人把“人话”编译成“机器语言”,C+、basic、pascal都是这类语言。解释型语言的源代码不是机器语言,是“人话”,所以需要通过解释器翻译成机器语言,才能被机器执行;

结果就是编译型的“机器语言”被机器执行的结果快,对人技能要求是懂机器语言,解释型语言的“人话”优点就是不需要太懂机器,说人话就可以做出来程序,正因为需要中间的翻译过程,导致机器计算结果相对慢一些。

5.内置库存在于JS在浏览器和NODEJS运行环境中,包含了JS代码执行时需要调用到的资源。如果JS是胎儿的话,羊水就是内置库,专门提供JS需要的东西。

6.第三方库和内置库共同构成JS的运行环境,JS偶尔会用到外界的资源处理数据,这个外界的资源就叫做第三方库。胎儿光有羊水还不行,也需要母亲吃食物,食物就是JS的第三方库。(我自己大致这样容易理解)

7.学习JS的方向,增加思考问题的方式,通过JS代码编写过程,渐渐理解需要解决的问题的本质,达到满足某种需求。JS不是为了学而学,写出来的代码要能解决实质的问题。如果JS不能做到就要换其他方式,JS毕竟不是万能的。

了解到JS的局限性在哪里,哪些问题是它能解决的。 ================================================ FILE: homework/lesson1/lingxiao.md ================================================ # JavaScript第一次作业 ## 前言 2017年8月8日徐高阳老师《JavaScript编程入门》第一次作业。 [TOC] ## 作业 1. 类比代码执行流程 2. 运行环境 3. V8引擎 4. 编译器/解释(执行)器 5. 内置库 6. 第三方库 7. 学习JS的方向 ## 解答 ### 1. 类比代码执行流程 | 银行开户 | JS代码执行 | | :--------------------------------------- | :--------------------------------------- | | ![1银行开户](https://raw.githubusercontent.com/LydiaLing/MyPostImage/master/Js_Homework/Lesson1/1%E9%93%B6%E8%A1%8C%E5%BC%80%E6%88%B7.png) | ![2JS代码运行](https://github.com/LydiaLing/MyPostImage/blob/master/Js_Homework/Lesson1/2Js%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C.png?raw=true) | | **开户环境:** 提供包含接受申请、检验申请单信息和核对资格的服务。
**内置服务:** 为满足用户填写订单时提供的一组内部服务。
**核心:** 涵盖预处理和执行。其中预处理执行开户前进行信息检查的处理过程;执行是执行开户操作的过程,操作完成后返回想要的开户结果。
**第三方服务:** 围绕开户业务的第三方服务以满足用户需求 | **JS运行架构同银行开户过程完全相同:**
1 两类运行环境类比于普通用户和VIP用户环境;
2 V8引擎类比于业务核心;
3 两者都有内置服务,各自支撑业务需求。
4 围绕两个运行环境,有第三方库供调用。 | ### 2. 运行环境 JavaScript脚本的运行环境有两种:**浏览器环境**和**Node.js环境**。 | 浏览器运行环境 | Node.js运行环境 | | :--------------------------------------: | :--------------------------------------: | | ![3浏览器的运行环境](https://github.com/LydiaLing/MyPostImage/blob/master/Js_Homework/Lesson1/3%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9A%84%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83.png?raw=true) | ![4Node的运行环境](https://github.com/LydiaLing/MyPostImage/blob/master/Js_Homework/Lesson1/4node%E7%9A%84%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83.png?raw=true) | 1. JavaScript被定义为浏览器的脚本语言,其[设计的初衷](https://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513059&idx=1&sn=a2eaf97d9e3000d15a33681d1b720463#rd)是一些本来就应该在浏览器中完成的任务,做一些浏览器与用户的交互和一些网页的特效来补充HTML和CSS的不足。 2. node.js诞生于2009年,是使得JavaScript可以运行在服务器端的运行环境,用于方便地搭建响应速度快、易于拓展的网络应用。 ### 3. V8引擎 JavaScript解析引擎就是能够“读懂”JavaScript代码,并准确地给出代码运行结果的一段程序。比方说,当你写了 $var a = 1 + 1; $这样一段代码,JavaScript引擎做的事情就是看懂(解析)你这段代码,并且将a的值变为2。[^1] V8引擎是Google Chrome浏览器内置的JavaScript脚本引擎,其设计以高效地执行大型的JavaScript应用程序为目的。Chrome仅使用V8的API,其引擎的内核部分独立于浏览器之外。V8引擎用来编译和执行JavaScript源代码,其将JavaScript源代码直接编译成机器码运行。[^2] ### 4. 编译器/解释(执行)器 | 编译型语言 | 解释性语言 | | :--------------------------------------- | :--------------------------------------- | | ![5编译型语言](https://github.com/LydiaLing/MyPostImage/blob/master/Js_Homework/Lesson1/5%E7%BC%96%E8%AF%91%E5%9E%8B%E8%AF%AD%E8%A8%80.png?raw=true) | ![6解释性语言](https://github.com/LydiaLing/MyPostImage/blob/master/Js_Homework/Lesson1/6%E8%A7%A3%E9%87%8A%E6%80%A7%E8%AF%AD%E8%A8%80.png?raw=true) | | 对于静态语言来说(如Java、C++、C),处理上述代码的叫编译器(Compiler)。
需要一个专门的编译过程,通过编译器编译成机器语言。 | 于JavaScript这样的动态语言则叫解释器(Interpreter)。
**解释器是直接解析并将代码运行结果输出**,边翻译边执行。 | ### 5. 内置库 由两种运行环境提供的服务,用来实现代码功能。就像在中国用人民币,可以直接用。 [JS标准库的部分内置对象的常用属性和方法](https://segmentfault.com/a/1190000004954578) ### 6. 第三方库 由第三方公司或个人提供一套接口,供开发者使用,以实现代码功能。就像是在中国用外币,需要兑换后使用。 ### 7. 学习JS的方向 做好笔记,做好课后补充,不怕丢脸多提问题,多操作时间,下足功夫,用心钻研,拥抱JS的美好。Ps: 当我还在困惑于zotero的文献导出怎么设置的时候,在简书上看到一位仁兄2015年的文章,人家已经在github对两个我都不知道怎么用的插件进行修改了,说着一大堆我不懂的术语,于其中看到一个熟悉的字眼,JavaScript,文中说zotero的插件是Js脚本...这刺激我另一次关于编程学习的思考。那我学习编程的目的是什么?就是为了完成私人订制,定制适用于我的代码,让我的生活越来越美好。 [^1]: http://www.cnblogs.com/mrxiaohe/p/5072034.html [^2]: http://www.nowamagic.net/librarys/veda/detail/1579 ================================================ FILE: homework/lesson1/linxiyao.md ================================================ 8月8日第一节课,听完感觉秒懂,到做作业写总结却有点傻眼,看来感觉靠不住,于是听了一遍回放,试试用自己有限的理解来描述。 代码执行流程类似于写说明文的过程:代码就像各种特定素材,先输入到大脑,经过大脑这个黑盒进行梳理、阐释(编译、解析),最后输出文章(结果)。两者都有一定的格式,运用(运行)得当时都可以输出稳定且通用的结果,便于交流。 运行环境,是供代码调用、支持代码起作用的的特定环境。JS运行环境有浏览器运行环境、node运行环境。运行环境类似于作者写作时所处的环境总和,比如可以是书房(包括笔记本,书桌椅,大脑等),也可以是卧室(包括笔记本,床,大脑等)。 JS运行环境包含内置库和V8引擎,内置库类似于作者头脑中已有的稳固知识,V8引擎相当于思考,可以调动已知库。第三方库就像Google、wiki、图书馆等,延伸了已知,提供了协作,也减轻了存储负担。而大脑就像解释器吧,你输入红橙黄绿青蓝紫,它返你一个彩色的世界。我不是色盲,我想用JS的大脑看世界。 ================================================ FILE: homework/lesson1/lipeng.md ================================================ #### 【第一次作业】写一篇总结 1 **类比代码执行流程** 用户在银行开户的过程,就是代码的执行过程。 这个类比引出了JS运行环境框架,无论是浏览器的环境,还是NodeJS的环境,都包括 业务核心和内置服务。 写JS代码就是,面向运行环境和第三方库,进行编程。 2 **运行环境** js代码的运行环境,相当于婴儿生活的环境,或者新学生生存的环境,分为浏览器运行环境和 NodeJS运行环境。 浏览器运行环境和NodeJS运行环境,包含了v8引擎,和内置库。 第3方库,不属于运行环境。 3 **V8引擎** 负责JS代码的解释和执行。相当于银行执行开户命令的部门。 4 **编译器/解释(执行)器** 从编译角度区分,这是两类语言。JavaScript属于 解释类的语言,特点是编程效率高。 5 **内置库** 这是JavaScript 自己带的库,分浏览器环境和NodeJS环境。 浏览器的内置库,包括网络库、日志库、JS内置对象、... NodeJS的内置库包括 JS内置对象,Node API。 6 **第三方库** 第三方提供的,实现一些功能的库。浏览器和NodeJS的对应的第三方库不同。 7 **学习JS的方向** 三个步骤: > 学会 JavaScript的语法,熟悉 内置库和第三方库 > 用上述技术实现业务需求 > 了解第三方库的优缺点,能找到最合适的解决方案 让我惊讶的地方是,JS竟然是无边际的,竟然有100多种语言 base 在javaScript上。 还是老师的概括更准确: 掌握编程语言,用编程方式**调用**服务来完成你的需求。 了解和掌握**重要的服务**能力,使其能服务你的业务。 善于**比较服务**/技术之间的差异性,用最好的方式实现你的业务。 换一个角度,第1步知道怎么用,第2步知道用什么(重要),第3步 知道用什么最好。 ================================================ FILE: homework/lesson1/lipengyu.md ================================================ ## 第一次上课总结 本次课程以银行开户流程为例子,由银行的业务架构引出JS的**运行环境**框架,生动易于理解。 ### JS运行环境 1. 浏览器运行环境 * V8引擎 * 内置库 2. Nodejs运行环境 * V8引擎 * 内置库 一句话:运行环境包含了**V8引擎**和**内置库**。其中,V8引擎可以理解为一个可以执行代码的黑盒子,内置库就是我们写代码时可以调用的内置服务。 另外,因为内置库的数量和种类有限,这时就要用到功能更加丰富的**第三方库**。 ### 两种语言类型 1. 编译型语言 2. 解释型语言 刚开始的开户流程也是**类比代码的执行流程**。 编译型语言代码执行流程大致是:代码--编译器(负责分析词法/语法/语义等)---编译好的代码---执行器(负责解释代码/执行代码)---输出结果。 这种语言的特点是:代码执行考虑高,但是开发效率低。 解释性语言(比如JavaScript)是代码直接到**编译器/解释器**---输出结果,代码执行效率低,但是开发效率高。 ### 学习JS的方向 认真和专注。 ================================================ FILE: homework/lesson1/litao.md ================================================ 第一次课听下来,由于老师用生活中常见的事物进行类比,讲的通俗易懂,使得这些抽象的概念比较容易理解。尽管如此,还是又听了一次回放,才感觉不那么晦涩了。 反而是课前的预习作业,对git工具和GitHub社区的陌生,让我反反复复地阅读老师的操作说明,一次次地练习,慢慢建立起相互之间的逻辑关系,熟悉操作指令,理解每一个步骤的作用,才能将完成的作业提交给老师。 今天再次打开github,发现我之前的作业根本没有提交成功,而且都没有了,就重新再写一次吧。 运行环境:打个比方说就是适应不同人的生活工作学习的环境。而对于编程来说,就是让这个程序语言能够运行的环境,在这个特定的环境下,这个语言才能发挥出作用。对于javascript来说,就是浏览器和node,分别是前端和后端的运行环境。 v8引擎:就好比汽车发动机的核心部位,在这里进行代码的编译和解析。 编译器/解释(执行)器:那就是汽车的发动机了,直接将输入的代码进行编译和解析。 内置库:类似于银行开户时提供的内置服务体系。 第三方库:围绕JS语言开发所提供的许多外围的服务。 学习JS的方向:基础太薄弱,每走一步都要理解补充很多想不到的概念。总算知道了git是一个工具,GitHub是一个开源社区,可以使用git这个工具将GitHub与个人电脑关联起来,进行各种操作,在GitHub上创建保存各种项目,并可以让全世界的软件人员直接在上面进行添加修改,我想GitHub的储存功能应该类似于一个服务器了。而在它上面进行的添加修改的功能则属于GitHub独有的创新了。 这只是我到现在的一些认识,随着课程的推进,会随时刷新改变我的很多认知。 我目前唯一要做的:跟着老师的安排,一步步跟上,完成作业。多阅读理解操作说明,多进行实际操练。 ================================================ FILE: homework/lesson1/liujuanjuan1984.md ================================================ ## 听新生大学CTO讲JavaScript编程入门-1 by 刘娟娟 2017-08-17 第一课,是切换认识世界的视角,从现实世界切换到编程世界。 用**类比**的方式,来学习新知识,新知识显得那么亲切。_不愧是李笑来老师的新生大学,连CTO都非常热爱类比,并运用的太棒了。_ 老师带领我们用银行开户这个类比,来理解编程世界。 我们**去银行开户**,是我们的目的。 我们需要向银行提交资料,拿到卡或者获得不能办卡的理由。这里有一个业务交互的**流程**。 资料是我们向银行提交的数据,拿到卡或者获得不能办卡的理由是银行返回给我们的结果,这个结果也是一种数据。万物皆**数据**。 我们编写代码,正是为了处理数据,获得结果。这是我们目的,有它的业务流程,有它的数据交互。而它们所发生的**环境**,即运行环境。 运行环境,是我们提交代码、运行代码、输出结果所在的环境,有内置服务、解释器和编译器。我们重点要关心服务,解释器和编译器不是我们关心的范畴。_此时A8引擎默默哭晕在厕所。_ 编写代码的环境,是**编辑器**。编辑器太多了,每个人都有自己的心头好。比如我曾经爱用notepad++,这次吃了utf-8的亏,按老师建议换成了vscode。 既然说,要重点关心**服务**,那么什么是服务? 就像去了银行,有免费的饮用水、复印机、沙发、大堂经理解释引导之类,帮助我们获得更好的用户体验,在代码的运行环境里,也有各种服务,帮助我们更好的编写代码、处理代码。 记住,服务既有运行环境内置的服务,也有第三方提供的丰富服务。而服务总归是服务,良莠不齐,帮助我们达成目的,但很显然并不是我们的目的。 银行向客户提供了普通用户、VIP客户等不同的服务,或者说,个人业务、公司业务、理财业务等等不同的服务,编程世界也类似。具体如JavaScript,我们这次要学的就有浏览器、node这两个运行环境。 银行在处理开户流程上也有不同的演变,就如同编程语言也有不同的演变。但这不重要,因为我们要学的是JavaScript入门课程。 老师向我们洗脑了3个重要的心法: 第一条,老夫写代码就一把梭子,复制粘贴,**开干**就是! 第二条,把注意力放在最重要的点上,什么是最重要的点?跟着老师的课**划重点**! 第三条,学会老师的**编程思想**,跟着老师引导认真走一遭,而不是东搞西搞花里胡哨。 记住,从零入门,你可以的,我也可以的。老师把自己的底线拉的特别低,并且总是会回答任何小白的问题。_令人震惊的耐心,老师为什么如此做,你和我一样一定也很好奇对吧?_ 第一次课程要点: 1、类比代码执行流程 _用银行开户流程这个类比,来理解代码的执行流程_ 2、运行环境 _JavaScript的运行环境这次课程学浏览器、node两个,分别对应前端、后端_ 3、V8引擎 _忘掉它吧,它但重要但默默无闻,不用关心它是怎么做的,它总是在那儿_ 4、编译器/解释(执行)器 _JavaScript是解释型语言,编译器与解释器都已经被封装起来了,就是A8引擎内部的结构_ 5、内置库 _运行环境中内置的服务,这些服务打包起来,就是一个一个的库_ 6、第三方库 _运行环境之外,由第三方提供的服务_ 7、学习JS的方向 _不用怕,跟着老师学,老师教思想、划重点,我们撸起袖子开干_ 小结一下,今天记住银行开户流程图,就能理解编程世界的运行环境。 至于怎么学习JavaScript呢,在短短的一个半月12节课程,尽可能多的投入,老实领悟和按老师划的重点去学就好了。 ================================================ FILE: homework/lesson1/liujun-sh.md ================================================ # 第一课总结 ## 1.类比代码执行流程 代码的执行流程就好比我们去银行办理银行卡,首先你需要填写表格(编写代码),当你在填写表格的时候发现需要打印身份证(打印机就好比内置库,你调用了打印机可以打印图片的功能),如果你还需要办理贷款业务,你需要证明机构用来证明自己有还款能力(证明机构就好比第三方库,可用用它出具的证明才说明自己有能力还款),表格填好后递交给大厅工作人员,大厅工作人员检查申请表格填写是否正确规范(这个过程就是一个预处理的过程),检查没有问题后转交给了窗口工作人员,由窗口工作人员进行征信及资格等校验(这一步就是执行的过程),校验完之后通过发卡/不通过驳回并告知为何不通过(代码输出成功/错误并显示错误信息)。 ## 2.运行环境 JS本身就是一个运行环境,在其内部又分为浏览器运行环境和Nodejs运行环境,运行环境是用来处理和执行代码并输出结果。 ## 3.V8引擎 V8引擎用来提高代码运行效率、运行速度 ## 4.编译器/解释(执行)器 编译器用来分析词法、语法、语义、优化代码 解释器用来解释代码、执行代码 ## 5.内置库 编程语言本身自带的工具,可以直接拿来使用。 ## 6.第三方库 外部机构提供的工具,使用的时候,需要先导入进来,才能使用。 ## 7.学习JS的方向 学习编程语言,使用编程调用服务来解决自己的个人需求或工作需求。 面对问题选择效率最高的工具来解决自己的需求。 ================================================ FILE: homework/lesson1/liujun.md ================================================  JavaScript第一课课后总结 1.类比代码执行流程 用银行开户的的流程类比代码执行的流程。用户类比代码,银行类比运行环境,开户流程中的审查、执行类比代码执行中的内置库和V8引擎。 再通过定义板块,环境、内置服务、业务核心、第三方服务。使得与编程流程达到逻辑一目了然。总体上理解了编程的实现过程。 2.运行环境 有web运行环境和Node运行环境二种。前端开发用浏览器运行环境,后端开发用node运行环境。 3、V8引擎 V8引擎就是运行代码的。 4、编译器/执行器 编译器:1.分析词法 2.分析语法 3.分析语义 4.优化代码 执行器:1.解释代码 2.执行代码 5、内置库 是运行环境提供的一组服务,有利于我们更好的实现代码功能。 6、第三方库 由第三方提供的各种各样的服务,更好地促进我们的代码功能的实现。 7、学习JS的方向 小白阶段 谨记“掌握编程语言,用编程方式调用服务来完成你的需求。” 提高阶段 “了解和掌握重要的服务能力,使其能服务你的业务。” 进阶阶段 “善于比较服务/技术之间的差异性,用最好的方式实现你的业务。” ================================================ FILE: homework/lesson1/liuliyuan.md ================================================ # 第一节 JavaScript编程入门 课程总结 ###一、关键词 1. 类比代码执行流程 2. 运行环境 3. V8引擎 4. 编译器/解释(执行)器 5. 内置库 6. 第三方库 7. 学习JS的方向 ###二、课程总结 以在银行开户类比代码流程开始课程: 开户流程:我们将申请递交给窗口,然后得到我们的银行卡; 代码流程:我们将代码输入运行环境,然后得到我们的结果。 在这个过程中,窗口和运行环境对于我们就是**编译/解释(执行)器**,我们不需要知道其中的原理,只要其可以输出我们想要的结果即可。 但由于流程太过简化,所有工作由一个人或者单单引擎完成的话,会导致速度缓慢,不利于用户体验,所以通过对其流程不断优化,最终达到: - 客户的友好性:第三方服务搞定复印等业务;然后客户在业务窗口会得到满足用户填写订单时提供的一组内部服务,也就是直接跟你交流的业务员的服务; - 分工明确:分管不同类型客户的窗口,比如普通用户窗口和VIP用户窗口;每个窗口内部分工明确,有帮助你填写订单的业务员(内置服务)和资料审核人员(业务核心) **类比代码执行流程**,也就得出了JS的运行环境: - 用户的友好性:用户只需要敲入代码调用内置库、第三方库进行输入即可; - **运行环境**:运行环境分为浏览器运行环境和nodejs运行环境;各个运行环境中又都有内置库和V8引擎。 **V8引擎**:进行代码预处理以及执行,就像我们在办理银行业务时只跟坐在窗口的业务员打交道,而不跟后方核审资料的人打交道一样,我们在用JS的时候,也只是用代码调用内置库和第三方库进行输入,而不用知道V8引擎怎么工作; **内置库**:不同运行环境的内置库不尽相同,但浏览器和nodejs的相同内置库是JS内置对象; **第三方库**:由其他公司或者开源形成的对于我们完成工作有帮助的服务库。 在基本了解了JS这种解释性语言后,针对这种语言的特性,得出自己的**JS学习方向**: - 个人情况:自己是小白,对于编程了解甚少,需要从最基本的学起。 - 学习流程: >1、基本了解JS语言与其他语言的相同及不同 >2、尽快熟悉JS语言中基本的命令,能够较熟练 >3、了解内置库和第三方库 当然这些是基于现在的知识所订出的流程。之后跟上老师课程,及时发现自己的不足并加以改正,希望能在课程结束后有完整的提高计划。 ================================================ FILE: homework/lesson1/liuqing.md ================================================ # 第一次课程总结 在完成徐老师布置的课前预习作业时,还一脸懵圈,只知道生搬硬套过来,虽然还是完成了,也有了学习编程的信心,但是对开始的编程课还是有些忐忑,生怕自己听不懂。 没想到小白的编程之旅——第一堂课会是以“银行开会流程”来切入的,跟着老师的思路,信心马上就提升上来了。整个1个半小时下来,虽然仍有不明白的地方,但是对JS编程终于也有一些感觉。 再加上回看了几遍,补充了一些断层知识和概念,下面就对第一堂课的学习内容进行一下总结。 ## 一、梳理课程所学概念及内在逻辑 第一堂课主要通过类比“银行开户流程”的方式,认识了JavaScript运行环境框架及其涵盖的概念,以及代码解释、执行的基础流程。 ### 1. 所学概念 “银行开户流程”的业务架构与JS的运行环境架构非常相似,JS的运行环境架构主要由内置库、V8引擎组成,再加上一个第三方库,JS代码就能运行起来 - 运行环境:JS代码能被执行的前提,就像植物需要土壤才能长出花草一般,有了运行环境,代码才能通过计算机实现操作意图。JS的运行环境分为web端和nodejs在不同运行环境中,有不同的功能。 - V8引擎:属于JS运行环境中的核心,主要用来执行代码,JS代码被编译成计算机能懂的指令后,再执行代码。就像汽车的发动机,把燃油转化成汽车所需的动力。 - 编译器、解释(执行)器:JS作为一种编程语言,在输入端,由程序员来编写,然后V8引擎来执行代码。PS:JS属于边解释边执行的编程语言,开发率较高,但是运行效率较低。 - 内置库:类比为“银行开户流程”中的内置服务,为输入进来的JS代码提供一些额外的加成服务,对输入进来的代码进行一些预处理,方便V8引擎执行代码。 - 第三方库:类比理解为第三方服务,为主业提供一些直接可以调用的功能便利,转嫁一些风险。第三方库的作用同样是为JS代码提供一些方便执行的功能。 而不是要求JS什么功能都具备 ### 2. 课程内在逻辑框架搭建 - 流程:(代码+调用内置库和第三方库)→V8引擎编译、解释(执行)→输出结果 - 框架:运行环境包括内置库+V8引擎+第三方库,按照前、后端又分为浏览器运行环境和nodejs运行环境,在前、后端内置库的共同点都有内置对象 ### 3. 课程中有所启发的学习方法 老师通过类比“银行开户流程”来告诉我们JS运行环境架构,其中有一个思路值得借鉴。 - 设计流程→优化流程→定义流程→抽象出框架 ### 4.学习JS的方向: 一开始认为JS是专业人士的专用工具,后面加入新大之后,认识到编程的思维其实每个人都应该学习、具备,因为这是一种机器智商,关于人如何操作机器去高效完成工作,实现自己的意图。 编程语言是人和机器沟通的工具,就像不同国家的人使用不同语言一样,学会了编程,能与计算机沟通。JS作为一种前端、后端都能使用的语言,学习JS既要学会编程的思维,又需要出成果。 所以JS学习的方向是,掌握好JS的基础知识,以微信小程序为目标,实际出一个成果。 ## 二、预习作业实际操作中存在的问题 - github网页和终端使用流程: 1. git clone URL→本地修改→git status查询状态→git add 添加→git commit -m"提交日志信息"→git push origin master推送到远程 2. fork到自己的仓库→编辑、修改(网页版git上操作)→pull request给老师 - 存在问题: 1. 没搞清楚GitHub是搞什么的,先用再说吧 2. 在pr的时候,是直接在网页上操作的,没clone到本地仓库操作后用终端推送远程。 有个疑问:如果clone到本地仓库进行编辑修改,文件扩展名是.md这个是不是需要找个专门的编辑器来打开使用呢? ================================================ FILE: homework/lesson1/liuruyong.md ================================================ #1. 类比代码执行流程 高级语言写的代码 > 编译后的中间代码 > 不同平台的机器码 > 机器指令 中央文件 > 官僚系统传递 > 各地根据当地情况做解读 > 群众去执行 #2. 运行环境 运行时需要的支撑环境,运行依赖的库。 #3. V8引擎 wiki解释 > V8在运行之前将JavaScript编译成了机器码,而非字节码或是解释执行它,以此提升性能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。 我的理解:v8引擎厉害的地方,方便代码书写的同时,没有降低代码执行的效率。 #4. 编译器/解释(执行)器 编译器把高级语言编译为二进制文件,二进制文件加载到内存执行 解释器在运行时才进行代码的解析。 #5. 内置库 只有安装相应环境就包含的支持程序运行的最小代码库 #6. 第三方库 遵守相应规范开发的非官方代码库,实现官方库未实现的功能。库的质量由开发者能力决定。 #7. 学习JS的方向 基础语法+常用库+编程思想 ================================================ FILE: homework/lesson1/liushengsi.md ================================================ # 小白学JavaScript:JavaScript的怎么玩儿? #### JavaScript是怎么一回事儿? ###### 1. 银行办理业务类比JavaScript执行代码 回想一下我们在生活中是怎么办理银行业务的: - 我去到银行,准备在叫号机上取号,这时我发现叫号机上有“个人业务”、“对公业务”可供选择。因为这次是为自己开户,所以我选择了“个人业务”。顺利拿到号,正准备静静等候...... - 这时大堂经理过来询问我要办理什么业务,在得知我要开户后,大堂经理让我填写开户申请表,并准备好身份证复印件等材料 - 复印身份证?糟了!我来之前不知道所以并没有复印。这时大堂经理告诉我说不要紧,银行大堂就提供复印服务,免费!😄太好了!顺利复印好身份证,准备好所有开户所需要的材料。静静等候叫号...... - 终于到我了。快速走到窗口,告诉柜员我要开户并递上了所有准备好的材料。柜员顺利地帮我开通了账户,并交给我一张银行卡。嗯,开户到这里就办完啦!效率还算不错,等待时就准备好了所需材料,减少了很多在窗口等待的时间。 - 正准备离开银行,突然发现大堂的另一侧有保险相关的柜台。我想了想觉得保险这个东西最好还是买一份,于是我走向了保险柜台去办理保险业务。办理过程中得知这家保险公司支持用我刚办理的银行卡付钱,这真是太方便了,于是顺利购买了一份保险。 以上就是我们去银行办理个人业务时会发生的场景,当我们办理的不是个人业务而是别的业务时,有些具体的服务内容和业务内容会发生变化,但是办理流程基本不会变。 这跟JavaScript有什么关系呢?JavaScript玩儿起来就是这样的啊! - 你要用JavaScript做事情了(你去到银行准备办业务了) - 你要实现前端功能,JavaScript启动浏览器运行环境(你要办理个人业务,银行走的是个人业务流程);你要实现后端功能,JavaScript启动Node运行环境(你要办理对公业务,银行走的是对公业务流程) - 不论要实现什么功能(不论什么种类的业务),你都需要做一些准备工作(大堂经理预先让你准备好所需材料),准备过程中需要用到一些JavaScript的内置库提供的服务(银行提供的打印服务) - 写好了代码,不论前端还是后端,都送到各自运行环境里的V8引擎去执行(银行办业务的窗口),V8引擎里的解释器一边解释一边执行代码(窗口的柜员一边看材料,一边进行一步步操作,比如输入新开的账户的户名等),V8引擎执行完毕,输出结果(窗口的柜员办理业务完毕,交给你属于你的银行卡) - 我要增加一个功能,JavaScript的内置库没有提供这个服务(我要买一份保险,可是银行不卖保险),于是我调用了第三方库,第三方库提供这个服务(于是我去了保险公司,他们卖保险) 这样一类比,JavaScript怎么玩儿的是不是就相当清楚明了了呢?😄,我自己是觉得很清晰了的。当然,还需要在后续过程中不断去通过实践来不断加深理解。 ###### 2. 我的JavaScript学习方向 理解了JavaScript的玩儿法,我接下来的得明确自己在JavaScript这条路上的玩儿法了。 首先,作为一只小白,我该怎么学JavaScript呢? >要掌握一门编程语言,就是要能够用编程的方式调用各种服务来完成我的需求 其次,我该怎么提高呢? >要了解和掌握重要的服务能力,让它能够服务我的业务需求,即要熟悉内置库和第三方库 之后,我该怎么进阶呢? >要做到善于比较服务/技术之间的差异性,用最好的方式去实现我的业务 学习JavaScript的难点是什么呢? - 变化快:应对这一点,作为新手的我应该聚焦ES6,对于ES7、ES8等稍微关注下就好 - 无边际:这一点只能在后续学习和使用中去慢慢体会、摸索了 最后,想引用屈原的一句话来说明一下我当下的心情,并与同学们共勉! >路漫漫其修远兮,吾将上下而求索 ================================================ FILE: homework/lesson1/liushengxin.md ================================================ # 开始学习javascript第一节课总结 ## 1. 类比代码执行流程 代码其实就是把现实中的流程规范化,通过类比、对两者都加深了印象。一是现实生活中你觉得寻常的流程其实都需要严密的逻辑、也可以进一步的升级,可以加快流程的进度。二是学习代码就是认知流程的过程,只有逻辑可行、代码才会运行、要不只有崩溃。 我从中学到了几点: 1. **类比可以让人从未知到已知**,因为以前没有代码的概念,如果直接讲解代码会一头雾水,通过用已知代替未知、才会深刻的理解未知的事物。 2. **每件事都可以深入思考**。 银行流程有很多事情可以改进、生活学习中也有很多事情可以改进、画好流程图、可以突破自己 ## 2. 运行环境 JS的运行环境有两类:浏览器运行环境和nodejs运行环境。两类运行环境都有V8引擎和各自的内置库。 就像我们人类、活着需要自然环境、需要空气和水。这是我们生存的前提、但是热带和寒带的环境也稍有不同、所以一个地方需要光着膀子、另一个地方需要穿上大衣。 ## 3. V8引擎 V8引擎我类比成意识和大脑的关系,意识需要大脑的代码处理才能变成身体能够执行的神经脉冲、就是代码。 V8引擎是识别你整个语言逻辑的框架。 ## 4. 编译器/解释(执行)器 编译器就是把别人听到的话、转变成自己的行为的过程 说起来就是把你能理解的编程语言、翻译成机器能理解的语言、就是一个翻译执行器。 ## 5. 内置库 内置库就相当于我们的眼睛库、耳朵库、手库、脚库、大脑调用这些库就可以看见东西、听见东西、我们的大脑识别了猫。以后看到猫就可以直接调用这个库。 ## 6. 第三方库 第三方库就相当于小时候背的诗、读的文章、虽然都是别人的、但我们写文章的时候也可以拿来用。 ## 7. 学习JS的方向 编程就是另一个语言、就相当于英语。不会编程、就不会和电脑沟通,这个世界你只能了解你了解的那一小部分。 ================================================ FILE: homework/lesson1/liuxiaohaohao.md ================================================ Title: JavaScript第一次总结作业 Created On: 2017-08-11 19:43:28 +0800 其实,来学这门课是想要逼自己一把,觉得自己太久没有从零开始学什么东西了,想要找回一种学生时代的认真感吧! “怎么说呢,技术一点都不难,主要是方向感,拿起键盘就开干!” 老师说这话的时候,我就觉得特靠谱。好多时候多说无益,多做才是硬道理。 代码的执行流程是怎样的? 其实,就像是银行开户一样,你需要有很多操作,有一定的顺序。代码执行需要一个运行环境,这个运行环境就像是银行。 有了环境之后,代码跑起来需要有一个核心服务,V8引擎就来干这个工作,就相当于银行窗口内部的核心工作人员。V8引擎就相当于银行的核心业务,对代码进行预处理。 同时,代码的执行,还需要有一些内置的服务,相当于银行帮忙复印拍照的业务,虽然不是核心,但也不可缺少,方便代码正常的执行。 代码的执行,会用到一些第三方库,它不在JS的运行环境里,但JS代码的执行需要它的帮助,就像银行会有一些第三方的服务,而这些资源不属于银行本身,但你办业务时可能会用得到。 这么来看,代码的执行只是三次元世界里的一个变体,如果我们把代码的世界当作是日常,三次元世界,其实就是代码的具象化。突然想起了数码宝贝里游戏世界的具象化。 编程语言分为编译型语言和解释性语言两种。编译型语言,就像银行的开户流程一样做了几步,需要输入代码到编译器,然后输出,再输入到执行器里,输出执行结果。而解释性语言就比较简单,一步到位,输入到编译器解释器,然后输出结果,就OK了。 编译型语言和解释性语言相比较的话,前者是运行效率高,但开发效率低。后者是开发效率高,运行效率低。JS属于解释性语言。 内置库在我看来,就是自己家帮忙做事的小伙伴,而第三方库,就是别人家的小伙伴,但是也可以拿来帮忙做事的。 其实,学什么都需要做到独立思考。新手刚开始需要照葫芦画瓢式的学习,但是一旦掌握了规则和一些技巧之后,你就要开始做点自己的东西。基础打好了,可以让你吃上饭,但是想要成为牛逼的人,需要多问自己“为什么”,“技术的差异性在哪里”,“还可以怎么做”?等等一些,给自己开脑洞的问题。 ================================================ FILE: homework/lesson1/lixiang.md ================================================ 运行环境就像是一个人的大脑,负责处理接收到的信息,比如一条新闻,一个故事。 V8引擎是人脑中最智能的核心,至于它具体是怎么工作的,诸如神经元之间的链接之类,我们现阶段不需要掌握。 编译器就像是人脑里的语言模块。一老外跟自己说话,他的话就是一串代码,人脑分析完语法语义之后,整理一下,用自己语言表述出老外说了啥。 执行器就相当于,老外跟自己说话,听懂以后,按照他说的话去做了,而不只是停留在理解的层面。 内置库就像人脑里装了不同学科的内容。来西班牙语就调用西班牙语的库理解和分析,来了天文学的知识我就调用天文学的背景知识 。 第三方库就类似书本,在线课程,给自己在处理信息的时候添加辅助工具。 学习JS就是给自己脑子里增加多一个,甚至在此基础上发展出来N个,内置库;方向就是最简单朴素的:认真上课/写作业/研习课本/从错误中总结提高。要有耐心,要有恒心,脚踏实地! ================================================ FILE: homework/lesson1/lixiaoxin.md ================================================ # Javascript 初探 ## 【第一次作业】 运用下面这些关键词,把你知道的写出来。 1. 类比代码执行流程 2. 运行环境 3. V8引擎 4. 编译器/解释(执行)器 5. 内置库 6. 第三方库 7. 学习JS的方向 报名这门课时,我对JavaScript基本一无所知,只知道它是一种程序语言,Google了JavaScript,在维基百科看到了如下简介: > JavaScript,一种高级编程语言,通过解释执行,是一门动态类型,面向对象(基于原型)的直译语言。它已经由ECMA(欧洲电脑制造商协会)通过ECMAScript实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器(Chrome、IE、FireFox、Safari、Opera)支持。JavaScript是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持I/O,比如网络、存储和图形等,但这些都可以由它的宿主环境提供支持。 > 虽然JavaScript与Java这门语言不管是在名字上,或是在语法上都有很多相似性,但这两门编程语言从设计之初就有很大的不同,JavaScript的语言设计主要受到了Self(一种基于原型的编程语言)和Scheme(一门函数式编程语言)的影响。在语法结构上它又与C语言有很多相似(例如if条件语句、while循环、switch语句、do-while循环等)。 > 在客户端,JavaScript在传统意义上被实现为一种解释语言,但在最近,它已经可以被即时编译(JIT)执行。随着最新的HTML5和CSS3语言标准的推行它还可用于游戏、桌面和移动应用程序的开发和在服务器端网络环境运行,如Node.js。 意料之内地———基本看不懂,因为定义里面还嵌入了无数不懂的名词,而大脑无是法用未知解释未知的。倒也不慌,就跟着新大的JavaScript入门课,一探究竟吧。 第一节课,老师以银行开户流程类比代码执行流程,让我们迅速了解了JS运行的整体架构, 关键词: - 环境 - 内置服务 - 核心 - 预处理 - 执行 - 第三方服务 此外透过银行开户流程的改进过程我还学到了: 1. 对于重复事件,要有设计流程思想; 2. 流程不是设计出来就完了,还要不断优化 这正是我想踏入编程世界的初衷之一,即利用编程把自己从重复劳动中做解放出来。 而在使程序自动运行之前,需要对一整套流程做梳理和优化,才能使程序执行更合理及高效。 - 运行环境 如同人到一个陌生环境不是要急着行动,而是要先熟悉周围环境,知道自己在这个环境里有什么资源可以利用,要学习JS,首先也应该对JS处在什么环境、有什么资源可以调用有一个基本的了解。 运行环境有两种:浏览器和Nodejs,它们都有自己的核心(V8引擎)和内置服务,以及对应的可以调用更多服务的第三方库。 需要注意的是,浏览器和Node的运行环境是不一样的,各自提供的服务(包括内置库和第三方库)是不一样的,唯一一个共通点是两者具有一样的JS内置对象。 另外作为核心的V8引擎,老师说了对于新手,不需要知道它的运作原理,只要知道V8引擎是用来做对代码进行预处理和执行的就行了。 - 编译器/解释(执行)器 编译型语言,先编译后执行,需要专门的编译过程,通过专门的编译器翻译成机器语言,因此开发效率低,运行效率高; 解释性语言,边解析边执行,因此开发效率高,运行效率低。JS是解释性语言。 - 内置库 内置库简单来说,就是运行环境提供的内置服务,JS的内置库包括:网络库、日志库、JS内置对象,等等。 - 第三方库 第三方库,我理解的就是各种第三方(除了”我“、JS运行环境外的第三方)提供的更为或便捷或强大的服务,不需要自己从头设计、制作。比如穿衣服,不需要买布料自己做,只需要到服装店买回来穿就是了。 - 学习JS的方向 对于JS的学习方向,老师给了一些方向: 该怎么学习? > "要掌握编程语言,用编程方式调用服务来完成你的需求。" 我的理解是,在入门阶段,学习内置库和第三方库的功能,这个阶段,要能够通过调用内置服务和第三方服务写出代码,并让代码能够跑起来,成功实现需求功能。 该怎么提高? > "理解和掌握重要的服务能力,使其能服务你的业务。" 我的理解是,在入门之后,要学习和积攒一些重要的高频小套路,快速实现业务功能需求。 该怎么进阶? > "善于比较服务/技术之间的差异性,用最好的方式实现你的业务。" 我的理解是,在进阶阶段,对于实现某一个业务需求,应该要会不只一种方法,并且能对比出不同方法、路径的优劣,从而知道最短路径、最优选择是哪一种。 ================================================ FILE: homework/lesson1/liyihang.md ================================================ #1. 类比代码执行流程 类比银行开户,加入了计算机的部分概念思想,如预处理,封装,uml图 输入-》处理-》输出 #2. 运行环境 Javascript的运行环境有,浏览器和node VC的运行环境就是runtime, 包含各种dll等,如msvc.dll #3. V8引擎 google开发的java引擎,用于客户的,服务端,可高性能的编译执行 #4. 编译器/解释(执行)器 编译器,把源代码,编译、汇编和链接,输出为机器码的目标程序,运行时就直接运行机器码 解释器,把源代码产生易于执行的中间代码,在运行时进行解释 编译型语言:c c++ 解释型语言:javascript,lua,python #5. 内置库 运行环境自带,如 数学math库 #6. 第三方库 如算法库,控件库,组件库。 #7. 学习JS的方向 js用于网页开发,移动端开发,后端开发。 ================================================ FILE: homework/lesson1/luoruijun.md ================================================ # 第一课作业 1. 代码的执行流程:输入代码到运行环境,调用运行环境中内置库的服务,或调用第三方库的服务,送入运行环境中的v8引擎进行预处理和执行。 2. 运行环境是代码执行的环境,提供内置库的服务和v8引擎对代码的预处理和执行。JS运行环境有nodejs和浏览器运行环境。 3. v8引擎的作用是运行环境中对输入的代码进行预处理和执行,包括编译器器和执行器,编译器进行分析此法、语法、语意、优化代码,解释器进行解释代码、执行代码。 4. 内置库提供内置服务,内置库例如:网络库、日志库、JS内置对象等。不同运行环境等内置库包括等服务不同。 5. 第三方库包括jQuery、Vue、React等。 6. 学习JS的分不同的阶段,方向是掌握编程语言,掌握调用服务。第一阶段掌握编程语言,能用编程调用服务完成需求;第二阶段是了解掌握重要的服务能力,使其服务于业务。第三阶段是善于比较服务/技术之间的差异性,用最好的方式实现业务。 ================================================ FILE: homework/lesson1/maggiewong.md ================================================ # 作业1——总结第一节课的内容 1.类比代码执行流程 将代码执行流程和银行开户类比:JavaScript的运行环境分为浏览器运行环境和Nodejs运行环境,针对这两个运行环境有各自的核心V8引擎和内置服务,有一大批第三方库满足JavaScript代码的调用 2.运行环境 运行环境是一个可以执行代码的黑盒,分为编译器和解释器。V8引擎只是运行环境里很小的一部分,核心是内置库。JavaScript的浏览器运行环境和Nodejs运行环境内置库不一样,调用的第三方库也不一样,其提供的服务是有差异的——浏览器运行环境是前端,Nodejs运行环境是后端。 浏览器运行环境和Nodejs运行环境有一个共通的内置库JS内置对象,提供了一组JavaScript语言的特性。 3.V8引擎 V8引擎是对代码进行预处理和执行的核心。 4.编译器/解释(执行)器 编译器对输入的代码进行编译,即分析代码的词法、语法和语义并优化代码。 解释器对编译好的代码进行解释和执行,是V8引擎的一个组成部分。 对于编译型语言,如C语言,编译器和解释器是分开按顺序运行的,编译器将代码编译成机器语言再去执行代码,工作流程类似于银行开户流程优化版四。特点是运行效率高但是开发效率低。 对于解释型语言,如JavaScript和Python,编译器和解释器的运行是一次性完成的,不会对整个代码有明显的编译过程,工作流程类似于第一版简易银行开户流程。特点是开发效率高但是运行效率低。 5.内置库 由运行环境提供的一组实现代码功能的服务。 6.第三方库 由很多的公司、个人提供的商用或免费开源的库,提供比内置库更强大完善的功能。 7.学习JS的方向 初学者的方向是**掌握编程语言**,用编程方式调用服务来完成需求,这是学习的第一步。提高的途径是**了解和掌握重要的服务能力**,使其服务你的业务。了解第三方库的功能。进阶的方法是善于比较服务/技术之间的差异性,**用最好的方式实现你的业务**。思考有没有另外的库能解决这个问题,哪个更好。 ================================================ FILE: homework/lesson1/panqi.md ================================================ #第一次课程总结 ##代码执行流程:编写代码,解释并执行,输出内容。 ##JS运行环境:多样化,浏览器(前端)和Nodejs(后端)两种环境,拥有相同的JS内置对象,不同的内置库和第三方库。 ##V8引擎:用于完成预处理和执行等核心任务。 ##编译器/解释(执行)器:和英语翻译类似,编译器好比是将英语翻译成中文的工具,要先有英文输入、在工具内发生变化、最后输出中文;而解释器好比是同声传译,边听边译、随听随译,工作具有同步性特点。 ##内置库:属于自带资源,能够满足常规和经常使用的需求。 ##第三方库:属于外部资源,进一步扩大了可用资源范围,以满足多样化、差异化的开发需求。 ##学习JS的方向: ###初级——掌握编程语言,用编程方式调用服务来完成你的需求(有如小孩子学说话、中国人学外语,学习JS语言也要多学多练多琢磨,熟练运用、扎实掌握、内化为自己的一部分,才能充分有效利用各种资源,信手拈来、满足需求。) ###提高——了解和掌握重要的服务能力,使其能服务你的业务(JS有很多资源、功能,结合自身的需求,有针对性地突出重点,单点突破、纵深延展。) ###进阶——善于比较服务/技术之间的差异性,用最好的方式实现你的业务(正所谓条条大路通罗马,业务需求的解决路径和方案也非唯一,随着学习的深入,权衡各种方法的利弊得失,综合判定选择最适合的) ================================================ FILE: homework/lesson1/panyong.md ================================================ # 【第一次作业】写一篇总结 运用下面这些关键词,把你知道的写出来。 1. 类比代码执行流程 2. 运行环境 3. V8引擎 4. 编译器/解释(执行)器 5. 内置库 6. 第三方库 7. 学习JS的方向 ## 总结 现在是8月29日凌晨,回想8月8日那一节课,回放已经关闭了... 记得开课前,课程留言里有推荐这篇文章,[《在 2016 年学 JavaScript 是一种什么样的体验?》](https://zhuanlan.zhihu.com/p/22782487),看完就晕了,感觉要掌握JS好复杂。 老师上来,就贴了一张非常有执行力的图:不要给我说底层原理,框架内核,老夫敲代码就是一把`梭`!复制!粘贴!拿起键盘,就是`干`!然后开始讲框架内核。 从类比说起:银行开户流程,针对流程上存在的问题,一步一步优化,得到了一个高效的银行业务框架。而这个银行业务框架,和JS运行框架正好类似。 ### 1、先说js运行环境(V8引擎+内置库) #### V8引擎 js有`浏览器行环境`和`Nodejs运行环境`两个运行环境。就像银行开户时,有`普通用户开户环境`和`VIP用户开户环境`一样。`普通用户开户`和`VIP用户开户`,最核心的功能就是开户。`浏览器`和`Nodejs`,最核心的功能就是解释执行js代码,由V8引擎完成。 #### 内置库 `普通用户`和`VIP用户`去银行开户是,享受的服务是不一样的(当然,这里类比的重点不是VIP享受的服务更优越,类比的重点是二者享受的银行服务是不一样的),就像`Nodejs运行环境`提供处理文件服务`var fs = require('fs')`,而`浏览器行环境`为了安全是不允许访问本地文件的,另外`浏览器行环境`有`alert()`,这个服务又是`Nodejs运行环境`所没有的。也就是说运行环境内部提供的服务,就是内置库。 ### 2、再说第三方库 `普通用户`和`VIP用户`,除了开户以外,还有第三方需求,也就是银行不提供但是用户又需要的需求,比如绑定支付宝、公积金卡、医保卡、金融产品、股票,这些服务都和银行卡关系,但又需要银行之外的第三方来提供服务。`普通用户`主要需要的第三方服务可能是绑定支付宝。`VIP用户`需要的第三方服务可能是购买海外股票。也就是说,不同的用户,需要的第三方服务不同。`浏览器`主要的第三方库是和前端相关的,比如jQuery、Vue、React等。`Nodejs运行环境`主要的第三方库是和后端相关的,比如Express、Koa等(这些具体是什么?后续再了解) ### 3、学习JS的方向 学习JS的难处在于`JS变化快`、`JS无边际`。所以,学习JS首先要又一幅地图,上面类比中的`V8引擎`、`内置库`、`浏览器第三方库`、`Nodejs第三方库`就是地图,可以随时让你知道自己在哪里而不会迷路。 初学:先掌握编程语言,用编程调用服务(内置库,第三方库)完成需求。 提高:掌握重要的服务能力,使其能服务于重要业务。 进阶:善于比较服务/技术直接的差异,懂得用最好的方式实现业务。 ================================================ FILE: homework/lesson1/qiujingyu.md ================================================ #### 第一节课作业:总结 ##### 1. 类比代码执行流程 与银行开户流程进行类比: + 用户相当于程序员 + 普通用户相当于:开发前端使用js的程序员 + VIP用户相当于:开发后端使用js的程序员 + 开户申请相当于代码 + 银行相当于JS运行环境 + 普通用户的开户环境相当于浏览器运行环境 + VIP用户的开户环境相当于Nodejs运行环境 + 业务核心相当于V8引擎 + 内置服务相当于内置服务 + 第三方服务相当于第三方库 + 改进版的开户流程相当于C语言等编译型语言即C语言,编译器与执行器分开,运行效率高,开发效率低 + 传统的开户流程相当于JavaScript等解释性语言,编译器/解释器兼具有执行器功能,开发效率高,运行效率低 ##### 2. 运行环境 指处理JS代码的环境,包括浏览器的运行环境与Node的运行环境。 ##### 3. V8引擎 由美国Google开发的开源JavaScript引擎,用于Chrome浏览器中。目的是编译和运行JS源代码,处理对象内存分配,对不再使用的对象进行回收。 ##### 4. 编译器/解释(执行)器 编译器能分析词法、语法、语义,并优化代码。 解释(执行)器能解释代码、执行代码。 ##### 5. 内置库 JS本身提供的用于实现相关功能的模块。 ##### 6. 第三方库 国际标准化组织(ECMA)以外的个人或组织为JS开发的能实现相关功能的模块。 ##### 7. 学习JS的方向: + 对初学者来说 > 掌握编程语言,用编程方式调用服务来完成你的需求。 + 对提高者来说 > 了解和掌握重要的服务能力,使其能服务你的业务。 + 对进阶都来说 > 善于比较服务/技术之间的差异性,用最好的方式实现你的业务。 ================================================ FILE: homework/lesson1/shaozhen.md ================================================ #JavaScript第一堂课学习总结 ###徐老师通过讲解如何优化银行柜台工作流程,抛砖引玉类比出JavaScript代码的执行流程,深入浅出的介绍了JavaScript的总体面貌,令人印象深刻。 ###随后老师使用同样方式通过介绍婴儿和小学生的生活环境来类比出浏览器环境和node.js环境对JavaScript来说,有什么不同和相同点。 ###在浏览器和node.js中,它们都含有内置库可供JavaScript进行调用,虽然它们有部分是相同的,但是也有部分是不同的。因此同一段代码,未必能同时在浏览器和node.js环境中正常运行。而且他们都有很多第三方库来扩充它们的功能,第三方库有很多优秀功能,可以减少开发者大量时间和精力。它们之间还有一个共同点就是都具有V8引擎,这是JavaScript代码能够运行的关键,由对JavaScript代码进行解释执行,效率非常高,谷歌浏览器的优秀表现离不开V8引擎的加持。 ###JavaScript是一个开发效率很高的语言,这归功于它是一门解释性语言,它的一条语句可以在执行的时候再翻译。但是,这也导致了它运行效率低下。 ###JavaScript是一个应用广泛的语言,官方对它的更新也很频繁,可谓相关知识浩如烟海,无边无际,所以我们要找到学习的要点,深入研究。我们要利用JavaScript丰富的内置库和第三方库,用编程方式调用服务来完成相关需求,而且还要对重要的服务有足够多的了解和优劣的分析能力,善于比较服务和技术之间的差异性,使其能更好的服务业务,记住贪多嚼不烂。 ================================================ FILE: homework/lesson1/shenzhili.md ================================================ # 第一节课的总结 ## 1. 类比代码执行流程 老师课上讲了一个非常棒的类比:银行开户流程与JS代码运行环境。直播开始先讲银行开户流程,先是一头雾水地听了一段,后是恍然大悟。当徐高阳老师 将银行开户流程和JS运行环境的框架对应的时候,真的惊艳了:原来是这样,很好理解! 我从中学到了几点: 1. **类比这个工具的强大**,超出想象。(亲身感受才明白它的威力,仅仅从文字理解是不够的) 2. **优化流程**。 很多事情可以用效率低的方法完成,但做一个有心人去优化办事的流程,能达到事半功倍的效果。 1. **定义流程**。 定义流程是我课上才接触的概念,但我能想象它的强大:将流程定义清楚,不模棱两可,可以减少思考时的散乱,有助于提高思考质量(还有与人交流的效率)。 2. **总结概括能力可以训练**。 见识到了高手的总结概括能力,对比自己,发现有一个地方很关键:定义流程。 没有准确地定义流程,没有准确地把握事情先后关系和包含与被包含关系是影响叙述能力提升的障碍。 ## 2. 运行环境 JS的运行环境有两类:浏览器运行环境和nodejs运行环境。两类运行环境都有V8引擎和各自的内置库。 需要注意的是,在进行JS代码编写的时候,要明确自己写的程序是运行在哪个环境下的。由于浏览器和nodejs的内置服务是不一样的,如果你的JS代码调用了浏览器的内置服务,却在nodejs的环境下运行,那结果可想而知。 ## 3. V8引擎 V8引擎是JS运行环境的核心,V8引擎的功能是对代码进行预处理和执行,相当于编译器+执行器。初学者甚至初级中级工程师都不需要知道具体原理,把它当成黑盒就好了。 ## 4. 编译器/解释(执行)器 编译器:将代码翻译成机器语言 解释(执行)器:直接对代码进行excute ## 5. 内置库 内置库:运行环境提供的一组服务,更好的实现一些功能。**不用重复造轮子了,直接拿来用就好。能省许多力气。** ## 6. 第三方库 第三方库封装好了代码,并提供了接口。第三方库收到数据后将处理结果反馈回来,能帮助实现更强大的功能。 ## 7. 学习JS的方向 作为刚进入编程世界的小白,应该把注意力放在如何掌握编程语言这块,而且要深入学习,吃透概念。 ================================================ FILE: homework/lesson1/sophieQi.md ================================================ 第一次课程作业 老师在可用用类比的方式,用银行的办卡的服务流程推导出了代码的执行流程,用已知解释未知。 从程序的执行方式上分为编译器和解释(执行)器。 - 编译型是先编译后执行,需要一个专门的编译过程,通过编译器翻译成及其语言,运行效率高,缺点是开发效率低。 - 解释性是一条语句执行的时候才翻译,开发效率高,缺点时运行效率低。 在网上看了一个例子,对于采购日常用品来说,需要什么买什么,一次买一个内容,类似于编译器,是高需求,但需要不断的去响应新出现的需求。如果一次性列一个购物清单,把需要的内容一次性买回来,类似解释器,打包购买一次性齐活。 ![WX20170813-114417.png](https://i.loli.net/2017/08/13/598fccb3d6634.png) Javascript是解释型语言,有2种运行环境,分别为Node运行环境(后端使用)和浏览器运行环境(前端使用)。2者都包含内置库和第三方置库。 ![WX20170813-114518.png](https://i.loli.net/2017/08/13/598fcb7a0ebf9.png) ![WX20170813-114535.png](https://i.loli.net/2017/08/13/598fcb7a158e7.png) - 内置库:JS内置对象是2种运行环境的共同内置库。运行环境提供的一组服务内置库是 JS 内置的一些库,可以直接拿来调用。 - 第三方库:不同于内置库,需要require才能从外部调用。 V8引擎:用来执行代码,代码在V8中执行。解释器在V8引擎中。 ## 学习JS的方向 - 掌握编程语言——用编程方式调用服务来完成你的需求 - 了解和掌握重要的服务能力——使其能服务你的业务 - 善于比较服务/技术之间的差异性,用最好的方式实现你的业务。 ================================================ FILE: homework/lesson1/sunxl.md ================================================ ## 小白学JavaScript ## 共建小白用的JavaScript技术文档 1. 用去银行开户的流程来类比代码的执行流程 2. 运行环境有nodejs和chrome浏览器,V8引擎暂时不用理他。 3. 编译器/解释器 chrome浏览器就可以编译,JavaScript是基础语言,应用很广,基于它设计出的语言都有100多种,了解它对学习其他语言很有帮助。 4. 内置库需要初学者花时间精力学习的,第三方库也很重要,初步了解 5. 学习js,在不同的阶段,都有不同的提高方式,所以说这是一个可以不断提升的技能,徐老师总结的三个阶段的不同突破方法,也可以用到其他语言学习上。 ================================================ FILE: homework/lesson1/tangjianfeng.md ================================================ ##1、用开户流程来类比JS运行环境框架 用银行的开户流程来类比Js运行环境框架,JS代码类似对银行有服务需求的客户,以v8引擎对应业务核心(即预处理和执行),用内置服务对应内置库,用第三方服务对应第三方库。同时了解到运行环境包含浏览器运行环境和Nodejs运行环境,这两种运行环境分别对应前端和后端,分别在浏览器上或Node上运行,他们主要的共同点在于JS内置对象,两者有通用的命令,但各自主要运用的内置库和第三方库大多不同,某些命令如alert在浏览器环境中能跳出警告窗口,而在Node上却是运行错误,因此学习Js要分清在哪个环境中用,才能有的放矢。 ##2、主要学习的方向 主要学习的方向应该是熟悉代码的写作和了解内置库和第三方库,按照我上课的理解就是好好了解内置库和第三方库的作用,按照项目的实际来通过代码调用这些库中的资源,以达到用合适的库来做相应的事情,打个比方就是要解直角三角形三边长的问题最好用勾股定理,而不是用微积分。 ##3、运行环境 运行环境类似于一个婴儿或者小学生的生存生活的环境,由供他生存的生活的各种具体的环境来对他做各种服务 运行环境主要有浏览器环境和Nodejs环境,前端开发一般用浏览器运行环境,后端开发一般在Nodejs环境中用 运行环境中有内置库和v8引擎。 ##4、V8引擎 对代码预处理和执行 ##5、内置库 是运行环境提供给我们的一组服务。 内置库中有网络库,日志库,js内置对象等库。浏览器中包含很多内置库,例如js内置对象,WebAPI,WebGL,HTTP,WebRTC,canvas等 Nodejs的的内置库中有JS内置对象,Node API。 ##6、第三方库 第三方的库是由各种个人或公司编写出来方便我们实现更好更优质的服务的工具。 浏览器运行环境的第三方库主要有jQuery,Vue,AngularJS,React等. NodeJS的第三方库主要有:Express,Koa,Webpack,Promise等 ##7、编译器/解释(执行)器 编译器的几个主要作用:1、分析词法;2、分析语法;3、分析语义;4、优化代码。 解释(执行)器的主要功能是:1、解释代码;2、执行代码。 代码输入编译器,通过编译器分析词法、语法、语义及优化代码后,输出编译好的代码送入执行器,让执行器解释代码和执行代码,从而输出结果 JS是一种解释型语言,直接将代码输入编译器/解释器,它就能边进行分析词法、语法、语义,优化代码,解释代码,执行代码,不会有一个明显的编译过程,边编译边执行。 和编译型语言的区别是开发效率高,但运行效率低,因为它是边翻译边执行的。 ================================================ FILE: homework/lesson1/taobao.md ================================================ 【第一次作业】写一篇总结 运用下面这些关键词,把你知道的写出来。 1. 类比代码执行流程 2. 运行环境 3. V8引擎 4. 编译器/解释(执行)器 5. 内置库 6. 第三方库 7. 学习JS的方向 提交方式: 1. 请向getting-started-with-javascript项目发起pull request。 https://github.com/xugy0926/getting-started-with-javascript 2. 文档格式,markdown。 3. 提交homework/lesson1目录下。 --- 1. 类比代码执行流程 JS 代码流程,类比,银行开户的流程,内置服务,核心服务,第三方服务,不同的运行环境以应对不同的使用人群。 vip 和 普通用户, javascript 和 nd.js 2. 运行环境 可以运行代码的地方就是运行环境,例如浏览器或者编译器 3. V8引擎 谷歌开发应用Chrome 的一种引擎,在运行js 前转换成机器码以次提升效率 4. 编译器/解释(执行)器 编译器,将手写字符串或字节转换成机器码,再进行运算 解释器,直接执行 5. 内置库 语言本身开发所附带的库,以没满足基本使用 6. 第三方库 由第三方提供并支持的开源或闭源,免费或收费的库,以更好的服务 7. 学习JS的方向 “善于⽐比较服务/技术之间的差异性,⽤用最好的⽅方式实现你的业务。” ================================================ FILE: homework/lesson1/tuyilang.md ================================================ ### JavaScript编程入门第一节课总结:学习JavaScript的最少必要知识 老师先后通过两个类比向我们展示了学习JavaScript的最少必要知识。 ##### 第一个类比 用银行开户流程的优化过程类比出代码的执行流程,同时具体而形象的展示了编译型语言和解释性语言的区别。在这两种流程(银行开户和代码执行)中,真正重要的是(运行)环境。 JS的运行环境包含了内置库和V8引擎。当然,在这个运行环境之外,我们还需要第三方库(第三方服务)的支持。 而**在这个运行环境中更重要的**(对于新手,初级乃至中级学习者而言)**是其中的内置库**,而不是V8引擎(负责代码最终的执行)。 但是V8引擎恰好体现出了编译型语言和解释性语言的区别,编译型语言需要一个专门的编译器,经过编译器编译之后再送去执行,而解释性语言(JavaScript)的执行过程是边解释边执行,靠的就是V8引擎这个解释(执行)器。 ##### 第二个类比 用婴儿和小学生的生活环境的区别类比出浏览器和Nodejs的运行环境的区别。它们之间最大的区别也是使用的内置库不相同,还有一部分是用到的第三方库不同。 ##### 总结 通过这两个类比,可以总结出学习JavaScript的**最少必要知识**就是: > - **运行环境中的内置库** > - **第三方库** 而这两者(S的内置服务和第三方服务)也决定了我们学习JavaScript的正确方向: > 1. 初学:**掌握编程语言**,用编程方式调用服务来完成你的需求。 > 2. 提高:**了解和掌握重要的服务能力**,使其能服务你的业务。 > 3. 进阶:善于比较服务/技术之间的差异性,**用最好的方式实现你的业务**。 ================================================ FILE: homework/lesson1/wangmeiling.md ================================================ 【第一次作业】写一篇总结 运用下面这些关键词,把你知道的写出来。 1. 类比代码执行流程 银行开户流程,由客户和桂圆的简单分工,到银行方面有了内置的服务,比如打印身份证;到有了第三方,比如派出所。 通过银行开户流程的逐步优化到全面介绍代码的整个框架。我体会到编程思维是不是可以应用于日常工作的优化? 2. 运行环境 婴儿面临的世界和10岁小孩的世界是不同的,他们面对的世界就是环境; 而当我做在办公室里工作时,办公室的空间、办公室里的同事、空气、光线就是我工作的运行环境。 JS的运行环境是一个可以执行代码的黑盒。 3. V8引擎 V8引擎是属于运行环境中的一个小小盒子,它是执行代码的。 4. 编译器/解释(执行)器 对输入的代码进行解释、翻译,就像豆浆机一样把豆子打碎最后输出豆浆。 5. 内置库 可以直接调用的工具,就像修车行的工具箱里的工具。 6. 第三方库 公司、个人、开源、收费等提供的库(工具) 7. 学习JS的方向 我想学会搭建一个网页APP,用来记录每本书的阅读时间。 ================================================ FILE: homework/lesson1/wangshasha.md ================================================ # lesson1 homework 王沙沙 标签(空格分隔): javascript 2017.8.13 ##对编程的感性认知 就像去办银行卡,基本服务和增值服务分窗口,每个窗口执行特定功能,但都在银行里面完成的,偶尔特殊功能银行也需要和外面的组织合作;代码也是一样,在一个平台上可以进行多种服务的调度,你要哪种用代码调过来就好了(就像在银行/营业厅,你需要什么跑到对应窗口就好),有时候有些功能没有,就需要用到外面的功能集合(库)——小白的理解,不造是否有误 ##语言类型 javascript是解释型语言,就是你把代码拼好了塞进去让它耍,它自己在哪折腾就会有点慢;C,C++是编译型语言,大概是它做点事要向你反馈一下,进度稍微慢一点,其他好处我还不知道 ##编程环境 js可以用在很多地方,根据做出来的效果能不能直接呈现在大家电脑上,大概分两类:看得到的和一般人看不到的能呈现的是前端,不能的是后端。就像每个人在自己不同阶段所处的环境不同,js编程也需要不同的运行环境;前端的开发环境是chrome,后端是nodejs ##学js学的是什么 js编程是干什么:会用命令,调用内置库和第三方库 所以学习内容:小白起步时,会用命令; 进阶:熟悉这些库的用法; 提升:用最好的方式来实现需求 ================================================ FILE: homework/lesson1/wangwei.md ================================================ 1. 类比代码执行流程 > 比如去银行开一个户,先要填写申请单,对应的就是编写代码,把申请单交给银行工作人员审核,就是编译器和解释器 编译执行的过程, 然后是银行给出一个结果,或者有错误,重新修改代码,或者是通过,给出一个结果 2. 运行环境 >一个执行代码的黑盒,里面有 V8引擎 和 内置库 >JS 运行环境有两大类: >>1. 浏览器 运行环境 >>2. Nodejs 运行环境 >两种运行环境包含各自的 V8引擎 和 内置服务 3. V8引擎 > 代码在V8引擎里面编译和执行代码,然后给出结果. 4. 编译器/解释(执行)器 >对高级语言来说,需要一个编译器,将高级语言编写的代码 编译成 中间文件,然后 这个中间文件又再解释(执行)器里 给 电脑,最终给出结果. 5. 内置库 >运行环境自带的内置对象,可以直接调用 6. 第三方库 > 第三方开发的对象,需要引入,才能调用 7. 学习JS的方向 > 从小白到入门,掌握编程语言 >入门到提高, 了解掌握重要服务,解决实际需求 >提高到进阶 ,能够比较各个技术,服务之间的差异,用最好的方式来实现 ================================================ FILE: homework/lesson1/wangxuanding.md ================================================ 第一次作业 = 1. 类比代码执行流程 --- 代码执行流程,就像银行开卡,我们把要求填写的资料都填完(代码),银行职员(程序)检验我们的输入是否正确,正确则往下执行,有错误,则提示有错误,申请退回 2. 运行环境 -- 运行环境就是银行职员以及银行对于我们所输入信息进行处理,且有标准化规定的东西。 3. V8引擎 --- V8引擎就是职员对我们所输入信息的监视以及处理的过程 4. 编译器/解释(执行)器 --- 银行职员的读写能力 5. 内置库 --- 银行内部已涵盖的一些服务 6. 第三方库 --- 能客户提供服务的第三方,并不一定业务和银行没有重合的,也并不一定比银行好。 7. 学习JS的方向 --- 没特在意老师说的,我还是按照自己的方式来。 1. 大脑是无法通过未知的东西去理解未知的东西的。国内大学里的编程课,一上来讲了大段大段的基础概念,让人弄的云里雾里,难道要我们死记硬背吗?我的方式是,通过大量的实例,让自己知道这一个命令干什么的,那个命令有什么用,为什么要这样子。第一阶段,复制黏贴,第二阶段,对着代码敲,第三阶段,对着代码敲,同时划出部分精力去理解。一共运行3次代码 2.这样下来,自己对于那些概念已经有了一个大致的认识了,而且并不是那些空洞的文字,而是直接把这个命令和会带来的后果联系起来了。之后,就像是拼图,把之前已知的块与块结合,去拼凑出更大的东西,期间会不断的试错,同时会加强自己对于语法的掌握。 3.拼图大块地方都拼好了,剩下一些小角落,就查缺补漏,由于通过大量实例,已经知道哪些命令常用,且有使用价值,而且大半已经掌握了,去弄懂剩下小部分。还剩一些不常用的,遇到了之后再去学。 ================================================ FILE: homework/lesson1/wangyuliang.md ================================================ ##【第一次作业】写一篇总结 ###1. 类比代码执行流程 通过银行开户,输入开户人信息类比代码的输入,通过银行的处理类比编译器/解释器,然后输出结果。而JavaScript通过类比它是非常高效的,输入代码,通过内置库和编译器、执行器的处理就能实现效果。把麻烦都丢在内置库里的感觉。 ###2. 运行环境 运行环境,我想的是上班和下班回家,面对的情况不一样,你应对方式也不一样,不能拿工作的状态和家人相处。运行环境不一样,使用的第三方库也不一样,错用内置库和第三方库会使代码显示不了。见人说人话,见鬼说鬼话。 ###3. V8引擎 踩下油门(输入代码),引擎开始给油做功加大(V8引擎执行加快速度这个代码的),输出速度加快,编程就是踩下油门等待引擎加快速度 ###4. 编译器/解释(执行)器 编译器/解释器是V8引擎的一部分,它们负责分析你输入的代码表达的什么意思,到底给油还是减少给油。 ###5. 内置库 内置库就是系统自带软件,如去住宾馆,提供的房价包含服务基本保证你的需求,但你有些时候需要其他服务,这时候就会去第三方库寻找。 ###6. 第三方库 ###7. 学习JS的方向 >掌握编程语言,用编程方式调用服务来完成你的需求;了解和掌握重要的服务能力,使其能服务你的业务;善于比较服务/技术之间的差异,用最好的方式去实现你的业务。 放下傲慢虚心学习才是成为高手的方法, 带有目的性学习,学习这个编程语言是完成什么需求,把这个语言与实际需求相结合,掌握它们之间的差别,用最好的方式去帮自己达成目标。 ================================================ FILE: homework/lesson1/wangyunfei.md ================================================ ## 第一课作业 经过了连续几天的折腾,终于走到了交第一课总结作业的地步,感觉好不容易。下面我以一个小白的理解,来叙述一下第一课的感悟。 ### 一、运用类比 课程一开始,老师并没有着急直接讲专业的编程知识,而是讲了一个银行开户的例子,从一张最简单的开户流程图开始,几经优化,勾勒出一幅效率更高的开户流程图。但是这绝对不是单纯的讲故事。 这一类比的方法,是为了形象的勾画出代码的一个运行流程图。客户最初提供的的表单就是一页代码。客户开卡,就是代码的输出结果。 这一页代码(开户申请单)经过内置库(内置服务),然后流转到编译器、解析器(银行的业务核心),经过编译器、解析器的执行,最终输出结果(客户开卡)。 真的很佩服老师的智谋,通过这么一个形象的类比,来阐述代码运行流程。这种类比确实非常有效。 今天我又看了一遍课程回放,对老师经常讲的一句话有了初步理解。这句话是:“编程最重要不是敲代码,而是思考。” 我的理解就是,如果不去优化银行的整个业务架构,仅仅是靠提高窗口人员的技术水平, 那么就是把窗口人员累死,恐怕银行的整体运营效率也提高不了多少,开户的人一多,银行系统就要崩溃。 反之,经过优化了银行的业务架构,也就是优化了环境框架,可以迅速提高运行效率,这个是本质的提高。 ### 二、环境 提高环境,我就想起一个词,叫大环境。 老师通过类比讲故事的方法,是为了更好的阐释“编程语言的运行环境”。后来又举例婴儿、与小学生的生活环境,来类比程序的运行环境。简而言之,就是程序运行,到底需要多少组件类支撑他? 他才能生存下去,也就是运行下去。 银行的运行环境,包括很多。内置服务(第三方服务),预处理服务,核心执行服务,等。 通过类比,代码的运行环境,也是雷同。包括内置库(第三方库),编译器/解析器,等。 只不过,不同的代码,不同的编程语言,他们需要的内置服务(内置库),是不相同的。但是代码整个运行的流程大致相同。 ### 三、V8引擎: V8引擎,通俗的讲就是8缸的发动机,缸体呈V字型排列。 在编程体系里面也有这个词汇,我去百度去搜,大概意思是:V8将其编译成原生机器码(IA-32, x86-64, ARM, or MIPS CPUs),并且使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序在V8引擎下的运行速度媲美二进制程序。 请恕我水平太低,连读三遍,愣是没读懂。不过既然是引擎,那他肯定就是核心部件,有了它,整个运行环境才能运转下去。相较于银行的运行环境,V8引擎指的银行的就是银行的业务核心。这个核心部件,包括编译器/解析器,靠他们来执行。 至于V8引擎他们的原理,暂且不懂,不过V8发动机虽然不知道怎么制造的,但是只要能把车子开好,也OK。 ### 四、编译器/解释(执行)器: 编译器/解析(执行)器,这个到底是两个机器呢,还是一个机器呢? 在编译型语言中,比如c语言,他就是两个机器,先编译,后解析执行。 银行开户时,预处理人员搞好后,在交给核心审核人员,最后输出。 这两个人分开干活,运行效率高,但是开发效率低。 在解析性语言,比如JS语言中,他就是同一台机器,边解析,边执行。银行开户时,预处理与核心审核,两个活都是这一个人干,运行效率低,开发效率高。 ### 五、内置库: 内置库,这个在银行的运行环境中,就是指的内置服务。为了能够提高核心人员的运行效率,需要把客户的单子,进行同一的编排,嵌入,复印、格式化等。 这个内置库,在语言运行环境中,就是给代码进行相关的包装、整形、打磨、切割、清洗、编码、统一格式、等,然后让代码能够高效率的通过V8引擎,快速输出。或者说是为了让V8引擎快速识别他,并处理他,执行他。 ### 六、第三方库: 第三方库,这个说法是相对于内置库来的,因为内置库毕竟有限,所以需要有第三方库来支持。毕竟代码的格式千千万万,内置库也不可能全部搞定,需要第三方来援助。但是第三方库与内置库在功能上是一致的。如果有一天,第三方服务被银行收编了,呵呵,那么这个第三方库,也就成了内置库了。 ### 七、如何学习编程 本来第7个话题是学习JS的方向,但是我把它改成如何学习编程了,因为我确实还没有找到学习JS的方向,不过我可以说说我的大致规划。 因为,我是完全不懂编程,甚至对于操作计算机来说,也不是很熟练。 学习语言编程,我觉得首先自己要固定好时间,是上午学?还是下午学?每天学多久? 因为我工作性质的原因,我给自己订的目标是每天不低于一个小时,周末不低于三个小时,且每天都要进行,就按着老师的授课顺序来。 根据我这几天的思考,我觉得我只能按着我自己的基础来制定学习进度。没有办法去同他人的进度保持一致,大家的水平相差太多。学编程这个东西,我感觉不比吃饭,嚼烂嚼不烂只管往下吞吞,编程一旦有一个环节没学会,后面的根本进行不下去。 鉴于我的基础,以及我毅力差的性格,我暂时不给自己订学习目标,不打算这个月,或者这个季度,达到某种水平。每天保证学习一个小时以上,哪怕连续几天都在演练同一个项目,那也没关系。 至于具体学习步骤,就是两个字:“试错”,不停的试错。该试的动作,一个都不能拉下,我始终觉得,学习不能走捷径。 有一句话叫做“每天进步一点点,坚持带来大改变。” 能碰到这么具有爱心的“幼儿园老师”,如果不珍惜,恐怕是这一辈子的遗憾。最好的学习方法是什么呢?答案就是“做”。 做,你就对了。 ### 班级:JS编程幼儿园 ### 学生:王云飞 ### 日期:2017.08.12夜 ================================================ FILE: homework/lesson1/wangzhongbin.md ================================================ 第一节课的总结.md --- 周二听老师的课,第一次不是从字面,而是从普通人去银行开户的场景来了解整个js,对js的环境、执行逻辑有新的认知。 受益匪浅,类比是帮助理解的绝佳方法。 > ps: 这次是根据老师的建议,结合ppt,进行的第二次修改。 > 还是要注意听讲,不能自以为是……对于代码的理解出问题了。 ## 类比代码执行流程 **老师的类比是通过优化银行的开户流程** 假如你去银行开户,流程是3个: 1. 填写申请单 2. 去柜台开户 3. 发卡 最简单的是你填写申请单,然后直接就能去柜台进行开户申请。 ![这是最简单的流程](http://othyo5zr8.bkt.clouddn.com/17-8-12/43555693.jpg) 窗口的工作人员,会进行2个工作: **1.检查用户填写的申请表对不对,包括格式和信息的准确性。** >* 这里用户填写的申请单,就是你的代码: 每一个编程语言都要遵循相应的格式,即申请表的信息格式; 编程语言的内容,就是申请表上你填写的信息(包括格式)。** **2.申请表填对了,银行才会对用户开户进行审批。** 上图中,银行窗口是一边检查一边执行,这样用户的申请表填写流程不会很麻烦,但银行的运行效率会很低。 这和解释性语言类似, javascript作为解释性语言,就是一边编译一边执行,每一条代码在要运行的时候才会被编译,开发效率会很高,但执行效率会很低。 之后,老师对流程进行了4次优化,分别定义了银行的各种服务,包括:内置服务(打印身份证、存储款)、运行器(先预处理、确认申请表、再执行),以及第三方服务(充值话费或缴纳贷款?)。 从而定义了开户环境,这里,银行的开户环境就是代码的运行环境。 同时,针对不同的客户(普通客户/VIP金卡),银行会开辟出不同的工作环境,比如普通柜台,和vip柜台。 在不同的柜台窗口,银行的提供的服务,不都是一样的,这就类似javascript的2个运行环境,一个是浏览器,一个是nodejs。 在每个柜台窗口中,都会有一些自带的服务,比如(打印身份证、存储款)之类的,即是内置库。 ## 运行环境 运行环境,是代码的执行环境,就是之前提到的银行的工作环境。你的申请,需要到银行的窗口才能被执行。 假如javascript是一条鱼,运行环境就是水。 但javascript是淡水和咸水都能活的鱼。 在电脑里面,js能执行的地方,一是浏览器,一是nodejs,在这两个不同的地方,js可以做出不同的功能。 ## V8引擎 > V8是Google开发的JavaScript脚本引擎。 V8引擎编译和执行JavaScript源代码。 速度是V8追求的主要设计目标之一,它把JavaScript代码直接编译成机器码运行,比起传统的“中间代码+解释器”的引擎,优势不言而喻。 V8引擎是提升javascript运行速度的引擎 > 是javascript的发动机。 ## 编译器/解释(执行)器 每一个编程语言在运行环境执行时,是先通过编译器、执行器来变成机器理解的语言,再让电脑执行。 javascript是解释性语言,即一边编译,一遍执行,它的运行环境是编译器/执行器合二为一的,这样它的开发效率很高。 不过因为是边编译边执行,运行效率就低。 而编译型语言则是把编译器和执行器分开,需要先把编译型语言分析优化,生成一个编译过的机器语言,再把它进行执行。 编译和执行是分开的,这样它的开发效率会低,但运行速度很高。 ## 内置库 内置库是环境里面自带的服务。 javascript运行环境,是浏览器和nodejs,已经带有的各种服务,不需要再安装了,比如js的内置对象啊,网络库之类的,只要有浏览器和nodejs,就会有这些服务。 ## 第三方服务 第三方服务,是除了运行环境中自带的服务之外,又被很多人/公司添加的服务。 比如,js要在水里游,这个环境里面的水啊、氧气啊之类,就是自带的服务,即内置库。 第三方服务就是被人/公司添加出来的,原生态的水和海里面是没有的,比如为了让鱼更好更快,有人投放了不同的饲料。 **复制了huangjiashu童鞋的话** >第三方库一般都是指同种语言开发的拓展功能,以满足多样化的需求。当然不排除会用其他语言开发第三方库供JS语言编写的代码来使用。比如:用C语言写一个高级算法(因为C语言效率更高),然后开发接口给JS用。那么这个接口比如满足JS语言对C语言调用规范。即:两种不同语言之间的调用,要满足一定的规范。这种规范一般情况只能是这两种语言相互认可。。python和C之间的掉拥又会有他们自己的规范。在绝大多数情况下,JS不太会用到其他语言的开放库。在学习过程中只聚焦在JS的第三方库即可! ## 学习js的方向 ![专注这张图的左半部分](http://othyo5zr8.bkt.clouddn.com/17-8-11/54878990.jpg) * 掌握编程语言,用编程方式调用服务来完成你的需求。 * 了解和掌握重要的服务能力,使其能服务你的业务。 * 善于比较服务/技术之间的差异性,用最好的方式实现你的业务。 这是老师的语言。 对于小白的我来说, 最好的方法还是: 1. 紧跟老师的步伐,先把老师讲的吃透,明白。 2. 掌握编程的思维和方法,如学习读代码,理解编程的思维和语言逻辑。 3. 精进,掌握具体的代码编写方法。 我理解一个东西,会先从大的概况来统筹理解它,然后再模仿,再抄袭,各个击破,错误的话,知道是哪一个部位出错了。 目标:掌握自学javascript的基本知识。 更大的目标:用windows,掌握前端和后端技术,能够独立开发一些小程序,或者微信端页面,是我的基本目标。 附属目标:在学校的工程中,我也积累了很多windows学js的坑,希望能够整理出一套系列的文章。 ================================================ FILE: homework/lesson1/wenliuxin.md ================================================ ### 1. 类比代码执行流程: a) 银行开户程序有用户,内置服务(打印、照相等),业务办理(核对申请表基本格式、审查申请内容是否符合标准) b) 编程中,用户就是代码,内置服务就是编译器,业务就是执行器。 c) 代码执行流程类比银行开户:写代码(用户),代码在编译器编译(使用内置服务),提交到执行器(业务办理),执行。 ### 2. 运行环境 好似小孩子生活环境的不一样,js有html环境和node.js环境。两种不同环境生活的孩子有不同的生活习惯,所以,不同的运行环境需要不同的代码 ### 3. V8引擎 黑盒子,输入一样东西,出来相应结果。一种类似烤箱一样的东西,你把面包弄好形状放进去,出来就是想要的烘培好了的面包。 ### 4. 编译器/解释(执行)器 编译器是把人类写的代码翻译成机器能够明白的代码,然后把这些代码发送到解释(执行)器中,电脑执行代码内容。 ### 5. 内置库 运行环境自带的功能,也就是好像银行里面请求打印、照相之类的服务 ### 6. 第三方库 除了js本身带有的功能,其他公司开发可以兼容到js的软件or功能 ### 7. 学习JS的方向 掌握编程语言;掌握服务器;比较不同服务器,哪种能够最简洁完成任务就选哪种 ================================================ FILE: homework/lesson1/wenyunxin.md ================================================ ## 1、类比代码执行流程 代码的执行流程就好比人根据一项说明说去完成某件事情,比如制作番茄炒鸡蛋,根据食谱的说明,调用准备的材料,按照某种顺序将材料进行加工,最后完成制作。 ## 2、运行环境 未查找资料我的理解:程序的运行所依托的系统构造。比如软件运行在windows系统和运行在lunix系统下,其运行环境就不一样。 ## 3、V8引擎 运行JavaScipt初始功能代码的系统功能。 ## 4、编译器/解释(执行)器 这应该是指能用代码运行的shell,如cmd,IDE,编程语言安装的shell等等。 ## 5、内置库 编程语言自带的可直接调用的使用某些功能的函数。如python里的max等函数。 ## 6、第三方库 需要额外安装的,有第三方编写的能实现某些功能的pakage。 ## 7、学习JS的方向 网页设计的HTML、CSS、JavaScript。其中JS是使网页实现动态交互和数据传输的语言。微信程序开发。 ================================================ FILE: homework/lesson1/wufan.md ================================================ # 类比代码执行流程 ## 1开户的流程 个人到大厅填写申请,递交给窗口工作人员,然后,由工作人员校验/审核资质(这个过程包括1检查信息格式2检查信息准确性;核对1征信2资格),最后要么通过发证,要么驳回重新填写。 优点是结构很简单,缺点是操作效率低下,一次过关率低。 银行开户流程是为了完成一项任务--开户。 #### 四次优化的开户流程 改进后第一版递交给窗口工作人员之间介入了大厅工作人员预处理,类似于氨压缩机预先冷气,然后再膨胀机再制冷,若不这么做,膨胀机入口温度高会导致膨胀机受损。同样预处理后就会方便下一步运行。预处理后,开户申请正确进入窗口环节,错误则驳回重新填写申请。正确申请后,再核对征信和资格,正确则发证,错误则驳回。 改进第二版,省去了递交回个人的步骤,直接由大厅工作人员确认好申请单交给窗口人员。在大厅工作人员环节保证信息正确包括格式和准确性。这就防止了用户的过多负担和反复修改的可能。 改进版三,减少了大厅工作的内容,直接在窗口内的环境完成,窗口内由审查申请和执行申请,组成预处理和执行部分。预处理完交给执行确认好的申请。然后返回到窗口传递到用户那里。 改进版四,窗口内的环境增设了很多内置服务,方便快捷更有针对性服务,因为有了各种模板所以非常快捷便于用户操作。 定义开户流程,用户,银行/开户环境/内置服务、预处理、执行、窗口。 ## 2运行环境 运行环境(浏览器、node)就是你要实现你需求必须去什么样的地方,这个地方能够满足你的需求,这就叫运行环境,比如你要洗澡要么去澡堂,要么去自己家里,要么去有干净水源的地方,这个地方就是你实现洗澡目的的环境。 为了实现你的一个业务或者需求,必须从某些内置服务或者第三方库的环境中调用相应的数据,这个环境就是运行环境。 开户环境就是一个办业务的环境,它能提供内置服务,预处理和执行业务的一些列流程。 开户环境:为了完成所需的银行服务必须去银行相关的地方来办理,这个银行就是开户环境。 多样化的业务环境包括普通用户或者VIP,类似于此,js的代码分浏览器业务和nodejs业务环境,代码在不同环境中的语法也是不一样的,编写的方法也不一样。 浏览器中的内置库,就是可以供代码调用的一切函数和第三方库如图所示 node的运行内置库与js只有js内置对象一样,其他的包括第三方库都不一样,所以这两者不能完全兼容,能在js环境跑的,不一定能在node上跑,这也是为什么js可以作为开发前端和后端的工具。 类似于不同的生活环境,js和node的不同环境属性,决定了了他们不能完全兼容,有一部分是可以跑的 业务架构,银行,用户,第三方服务。第三方服务类似于去公安局啊,单位开一些证明材料。 类似于业务架构,JS运行环境框架中,包含了浏览器运行环境,Nodejs运行环境对应的是普通用户的开户环境和VIP用户的开户环境。 输入代码是为了获得想要的结果,这个结果需要一个环境,就好开户只能去银行这个环境一样。如同递交申请和预处理执行审核一样,代码输入也希望能有想要的输出结果。 详细的环境是如何工作的,有代码调用各种库的函数等,再输入用V8引擎去执行。 ## 3v8引擎 v8引擎:在编译型或者解释型的过程中,加速执行效率的那么一个内置服务,在黑盒子里。 ## 4编译型和解释器 编译型先编译好完整的代码,然后执行。特点是,开发写代码效率低,执行运行快。 解释性是边解释边执行,运行效率低下,但是开发效率高。 编译型就是编译完再一块执行,如果有错误就要逐步检查,开发效率低,但是运行效率高。解释型边解释,边执行,开发效率高,运行相对来说低。 编译的进化之路,由开始的机器语言,到低级指令语言,到后来的间接调用低级语言的高级语言文件,一步步使得编程语言符合我们的自然语言逻辑。 通过阅读优秀代码库,来优化你的程序,更加高效的实现你的目的。 通过研究内置库和第三方库比如freecodecamp等github上排名靠前的js开发库来学习服务与技术之间的差异性,写出合适环境下的代码用于调用出最利于实现你业务的一些库 编程语言学的就是写出优雅的代码调用那些内置库,第三方库。 需要边编译,边执行的机器。 ## 5内置库 内置服务:开户时银行内部提供的一组服务。开发环境中固有的一系列服务,比如澡堂有卖拖鞋毛巾等,提供橱柜保管财物的服务。 ## 6第三方库 还是澡堂,它没有吃饭的服务,你需要去饭店吃饭,这个饭店就是第三方库,它可能就在澡堂附近。因为众多,所以称库。 第三方服务:银行不具备出具提供的证明等服务,需要由个人实现准备后,才能完成银行内部业务的服务。 核心业务:银行会有哪些直接提供的服务,供你能选择的业务,这些服务和业务就是核心业务。 预处理:在提供服务的时候,为了提高效率减少出错率,采取的有效措施。 执行:就是通过或者驳回客户的各种服务的申请。 第三方库一般都是指同种语言开发的拓展功能,以满足多样化的需求。不排除会用其他语言开发第三方库供JS语言编写的代码来使用。比如:用C语言写一个搞计算法(因为c语言运行效率更高),然后开发接口给js用。那么这个接口比如满足js语言对c语言调用规范。即:两种不同语言之间的调用,比如满足一定的规范,这种规范一般情况只能是这两种语言相互认可。python和c之间的调用会有他们之间的规范。在绝大多数情况下,js不太会用到其他语言的开发库。在学习过程中只聚焦在js的第三方库即可。 ## 学习js的方向 分为浏览器的前端开发,和nodejs或者node,后端开发。方向不一样环境也不一样。 ================================================ FILE: homework/lesson1/wukuipin.md ================================================ 1. 类比代码执行流程 > 当你去银行开户,将开户申请表提交到银行窗口,银行接收申请,在后台处理,通过审查和执行申请,然后返回结果。如果信息审核通过,银行就通过申请,这样就开好银行账户了。 2. 运行环境 > 运行环境分为(前端)浏览器的运行环境和(后端)Nodejs的运行环境。 > 他们的内置库都包含有JS内置对象,都有第三方库。运行环境就相当于一个人的生活环境,他生存下去的物质需求以及生活和工作上的各种社会关系构成的生活环境。这相当于JS运行的库,JS代码要执行就的有运行环境,否则代码就失去意义。 3. V8引擎 > 就是对代码进行预处理和执行的黑盒子。 4. 编译器/解释(执行)器 > * 编译器:需要一个专门的编译过程,通过编译器翻译成机器语言。特点:运行效率高。缺点:开发效率低。 > * 解释性:一条语句执行的时候才翻译。特点:开发效率高。缺点:运行效率低。 5. 内置库 >运行核心,就是在运行环境里面有哪些东西我们可以去使用。如:网络库、日志库、JS内置对象等。 6. 第三方库 > 围绕浏览器运行环境和Nodejs运行环境有很多第三方库,以满足javascript代码的调用。 7. 学习JS的方向 > ***掌握编程语言***,用编程方式调用服务来完成你的需求。 第一步:学会如何调用内置库和第三方库; > ***了解和掌握重要的服务能力***,使其能服务你的业务。 第二步,深入了解内置库和第三方库; > 善于比较服务/技术之间的差异性,***用最好的方式实现你的业务***。 ================================================ FILE: homework/lesson1/xianengqi.md ================================================ # +要熟练掌握`编程语言` ## +要熟练运用`内置库` ### +运用编程语言灵活运用`第三方库` ================================================ FILE: homework/lesson1/xiaochaoge.md ================================================ # JavaScript 的基本概念 ## **一、理解篇** ### **1.1 类比代码执行流程** 银行开户的流程演进就是程序语言一步一步演进的历史: 1. 最早开始的开户流程,主要依赖于用户自身和银行的交互,用户通过发出开户申请,银行负责审查和执行,最终确定是否开户。 > 这和最早的代码执行过程很像:代码向客户端请求一个命令,客户端核对无误后,才能执行。写代码的程序员花大量时间,千方百计的查找到错误,修正错误,才能进行下一步。更有可能的是,好容易通过了开户的资格审查,但是得到的并非正确的结果,就像开户的时候,张三的户挂着李四的名字,这个可是大大的不好了。修正这个难题本身,可能回比能正确的执行更重要。 2. 从用户出发,不仅仅是商业史上的重大演进,更是程序员的福音。通过大厅工作人员的检查校对,柜台办理人员的执行申请,是在编程里把编译器和执行器分开,编译的同时预处理,检查是否代码格式存在问题,执行时,关注内部的逻辑关系,把预处理和执行分开,极大的提高了语言的处理效率。 > 例如编辑性语言的 C 语言,通过编辑器的预处理和执行器的运行,提高了代码的处理效率。 3. 虽然按照两个模式提交代码能提高代码的运行效率,但是预处理和处理器能执行后自动执行,而不是让用户跑完大厅后继续在柜台前排队更能提高效率。 > 例如解释性语言的 JavaScript 做到了一边编辑同时执行,虽然从银行的例子来看,是提高了效率,但是不代表 JavaScript 比起 C 语言百利而无一害。 #### JavaScript 与 C 语言的区别 - C 语言运行起来不需要预处理,会体现为 **运行效率高,开发效率低** ; - JavaScript 语言运行起来一边处理一遍运行,更符合人类语言,更容易读懂,更容易移植到其他平台,体现为 **开发效率高,执行效率低** 。 ### **1.2 运行环境** 运行环境和代码的关系,说简单点,就是购物平台和电商的关系。以淘宝为例,淘宝是电商的平台,电商只有有货物,同时把货物上架到淘宝才能出售,确保货物能出售的买家卖家交流服务、能编辑处理货物的物理服务、以及处理钱款关系的支付服务,构成了交易体系的运行环境。 那么代码就相当于是货物,货物上架到运行环境后,要调用环境中服务来执行这段代码,包括这种货物能否找到以及调用合适的内置服务和第三方服务,是否符合可代码的正确格式,以及最终从输入到执行获得输出的结果。 - **总结一下,运行环境就是能满足代码处理和执行的环境,环境本身由内置服务和第三方的服务支持,以及预处理和执行器构成。** 当然,购物平台不止淘宝一家,所以执行代码的工具在不同环境会有不同的服务和体验,就像在亚马逊开店和在淘宝、京东开店一样,肯定有相似之处,但是也有不一样的服务 —— 关于买卖家的沟通,可能淘宝是我看到最好的,没有之一。 那么同样一串 js 代码,由于不同的需求,被送到浏览器的环境和 Node.js 环境,支持第三方库、内置库的不同,会导致编译的结果会有所不同。 ### **1.3 V8 引擎** V8 引擎,对初学者的我而言,并非一个很熟悉的概念。 简单检索了一下, V8 指的是效率高的 8 缸发动机, V8 引擎可能也是为了说明这个引擎快吧。 V8 引擎是由于 Google 为了提高编码的效率利用 C ++ 编写的一套提高效率的工具,缺失不产生中间代码、直接编译和执行确实提高了效率,但是提高效率更深层次的内容,我并没有看懂,下面是我检索到的文章,我觉得如果你想深入了解V8 引擎,或者以后我想深入了解它,可以借助这篇文章: http://blog.csdn.net/horkychen/article/details/7761199 但是,我可以理解 V8 引擎像游戏机,当我按下游戏机的按键时,游戏机内部发生了什么我并不知晓,但是我还能很好的控制遥控游戏中的角色,不是吗?目前,我先要看到结果,学会输入和结果之间的关系已经足够了。 - **总结一下,V8 引擎我可以认为它是个神奇的黑匣子,我不知道黑匣子里面是什么,但是我知道它能同时预处理和执行代码,是运行环境最为核心的组成部分。** ### **1.4 编译器、解析(执行)器** 就我的理解而言,编译器、解析(执行)器其实就是黑匣子 V8 引擎干的事。把它们分开的依据,可能是因为他们的目的不同吧: - 编译器:分析词法、分析语法、分析语义、优化代码 - 解析(执行)器:解释代码、执行代码 **对于编译器、解析(执行)器,前者负责看代码是否有错误,进行预处理,后者加工。把 V8 引擎看成一个黑匣子般的香肠的加工工具,输入的代码就是肉,输出的是结果是香肠 —— 那么编译器就是肉类的分拣、简单处理、剔除杂质,保证更容易被加工;解析(执行)器就是个干!** ### **1.5~1.6 内置库、第三方库** 理解库的关键在于 —— 为什么需要库? 库是为了能使得代码执行高效而可以被调用的一组程序。其中的一组程序和编译器、解析器一起直接被植入环境,被植入环境的程序叫内置库,不在环境内的叫第三方库。 当环境改变的时候,内置库和第三方库都会改变,就像一个婴儿和一个中年人所生活的环境不同,类似于浏览器的环境和 Node.js 环境的差异,那么它们所需的内置库和第三方库也就不同。 ### **1.7 学习 JS 的方向** 工具只是实现方法,而想象力可以把我们带到任何地方。学习 JS 或许是想把想象中和真实构建连接的台阶吧。 学习 JS 之初,先能满足想法的需求,做出来,掌握语言,保证先能实现再说;其次,需要了解服务的类型,用更好的服务服务你的需求;最后能对比服务和技术的差异,用最好的方式实现你的服务。 或许以上是做一个好程序员的需求,但是对我而言,了解 JS 的发展,判断它以后还会怎么发展,以及 JS 的理论还能用在别的其他什么地方,以后未来人和计算机是怎么沟通的,或许是更吸引我深入与它对话的原因吧。 反正未来大部分人的判断是人工智能,那么,如果人类和计算器交流的是未来的趋势,为什么不先假定这个计算器领域使用最广泛的语言 —— JS 开始呢? ## **二、代码篇** ### **2.1 git 基础** #### GitHub 新建项目指南 1. Fork项目/新建自己的项目 - New repository 2. 克隆项目到本地 - git clone url 3. 第一次改动 4. 查看改动的文件 - git status 5. 改动本地提交 - git add -A - git commit -m"改动内容" 6. 推送到远程仓库(远程服务器) - git push origin master #### Fork 项目更新 **命令模式:** 1. 确定同步的本地文件地址 - 终端 > cd 到自己 fork 后 git clone 的项目 2. 数据源 - git remote add upstream xxxx - “xxxx”代表你需要与之保持同步的数据源,需要键入同步的git项目地址 3. 取上游数据 - git checkout master //切换至master分支下 - git fetch upstream //获取上游数据 4. 数据合并 - git merge upstream/master//进行主节点和上游节点数据的合并 5. 本地合并后文件上传至 github 服务器上 - git push origin master #### 山穷水尽:丢弃所有本地改动和提交,从服务器获得新历史版本 git fetch origin git reset --hard origin/master ### **2.2 还未熟悉掌握的指令** #### rm 命令 删除文件或牡蛎 rm file_name rm -rf file_name // 强制删除 ================================================ FILE: homework/lesson1/xieyuhui.md ================================================  带你走进Java script 1. 当你去银行开户,你需要填写表格然后提交至窗口,静等银行工作人员校验、审核。通过之后你的开户任务就完成了。 http://t3.qpic.cn/mblogpic/6623754549bead7e26ac/460 2. Java script和银行开户是一样的流程,你需要把代码写入终端提交,解释器分析、解释、执行。通过后你就得到了你要的结果。 http://t3.qpic.cn/mblogpic/640a2eec3d0a15fae874/460 3. 当然银行开户还需要你的身份证复印件、相片,银行都配有这些内置服务。银行之所以能够审核你信息的真实性需要必不可少的第三方服务, 也就是必须有公安系统的支持。银行开户分普通开户和VIP开户,普通用户标配的内置服务、调用的第三方服务和VIP用户标配的内置服务、调 用的第三方服务会有所区别。 http://t3.qpic.cn/mblogpic/6abf7e2de0d11db1ac4e/460 4 JS也配也有标配的内置服务,和可以随时调用的第三方库。JS分为浏览器运行环境、nodejs运行环境,不同的运行环境所提供的内置服务和 第三方库是不一样的。 http://t3.qpic.cn/mblogpic/f2ead7db649e3baf4f9c/460 5. JS的运行环境: http://t3.qpic.cn/mblogpic/868ff88839c94709c5e0/460 http://t3.qpic.cn/mblogpic/6604ded60b59ad706640/460 http://t3.qpic.cn/mblogpic/d6ab25e3dcaa5cedc0fa/460 6. 浏览器的运行环境包含的内置库、第三方库: http://t3.qpic.cn/mblogpic/34f8789aa6ee3fe82650/460 7. node运行环境包含的内置库、第三方库: http://t3.qpic.cn/mblogpic/d0f9ea51b80e027fb65a/460 8. v8引警就先省略了,反正我是不懂。 9. 编译器/解释器的差异? • 编译型:需要⼀个专⻔的编译过程,通过编译器翻译成机器语⾔。你需要输入程序代码 -> 得到可执行代码要得到执行结果还得再去执行可执行代码, 从用户的角度看有[一个单独的编译步骤]和[一个单独的执行步骤]特点:运⾏效率⾼。缺点:开发效率低。 http://t3.qpic.cn/mblogpic/39ddd5d9e61879d020e2/460 • 解释性:⼀条语句执⾏的时候才翻译。你只需要输入程序代码 -> 得到执行结果,从用户的角度看一步到位。特点:开发效率⾼。缺点:运⾏效率低。 http://t3.qpic.cn/mblogpic/027f3f9f2b0bd625fd64/460 10. 下图是学习JS的方向: http://t3.qpic.cn/mblogpic/237d52b51d29cd39d1b8/460 http://t3.qpic.cn/mblogpic/16dcfb93b2bfaf59c8f8/460 11. 无论你是小白还是已经在工作,你都应该明白该怎么进阶: http://t3.qpic.cn/mblogpic/814e89b2c5bc04d4cffc/460 ================================================ FILE: homework/lesson1/xiongliyu.md ================================================ ----- # 第一次作业 ## 1.类比代码执行流程 老师用银行开户的流程来类比代码执行流程,首先把开户的流程大致的分为 了三步,从这三个步骤触发,逐一思考如何改进流程,发现了4各个需求: 1. 银行工作压力大 。 2. 用户压力太大,流程过多(其实到到改进版二我觉得基本的问题就没有了,接下来的改进,就是让这个流程更加优质)。 3. 提出一个疑问,能不能让用户只面对一个对象。 4. 用户在进入流程填写申请单之前用户还需要哪些东西。通过不断地分析需求、优化流程,最终得出一个完美的“用户开户流程”。 > 我的感受:从学习的角度看: > 1. 我们可以借鉴老师的思路,首先学会最基本的知识,然后去思考,去主动发现不足,带着思考和问题去主动学习。 > 2. 我们写的代码的执行过程就像上面的例子,今后的学习过程需要我们不断地去思考我们的代码,从而优化我们的代码。 > 3. 写代码的时候,是不是可以先梳理清楚我的思路?我要解决的问题是什么?还有没有别的更好的办法,然后再去把我的思路用代码书写出来?是这样吗?如果是这样的话,那么养成这种习惯就很重要。 ## 2.运行环境 浏览器的运行环境就是支持浏览器正常运行的各种资源(库),如果少了某一种资源(库),就会出问题。JS和node的运行环境就是不一样的,我们得区分开来。得清楚我在什么运行环境,我需要掉什么库,来解决我的问题。 ## 3.V8引擎 老师把他比如城一个 黑盒,不用去管的东西,不用去管代码是如何执行的。我发现一个现象:我们在学习JS的路上好像会很多的“V8引擎”,函数中有、数据类型转换中有、vue中有等等。我感觉每一个新的知识点都有,又好像,新手会不自觉地去思考它道德是如何实现的,那么是不是在我们的学习过程中,就应该清醒知道那些是V8,别去管它。是这样吗? ## 4.编译器/解释器 属于V8引擎类的东西。JS代码就是边翻译边解析边执行,也是不用管的。知道有这么个东西就可以了。 ## 5.内置库 属于JS运行环境中最重要的部分,也是我们学习JS的重点,需要去聚焦、熟练的部分,它是服务于我们写代码的,只有掌握了才能去调用这些内置库,从而完成我们的代码。梦想大楼的地基啊。 ## 6.第三方库 由第三方开源出来的库,也是学习需要聚焦的重点,学习初期听老师的话先把注意力在vue上。 ## 7.学习JS的方向 谨记老师给初学者的建议:**掌握编程语言,用编程的方式调用服务来完成我的需求 **。掌握编程语言,犀牛书就是我们要去搞懂的,多练的编程语言。 ================================================ FILE: homework/lesson1/xugang.md ================================================ # lesson1 学编程,为更好--xugang(徐钢) ## 更高、更快、更强 计算机、互联网处理信息、传递信息的效率很高、成本很低。如简单类比,处理信息对应生产,传递信息对应交易。一个行业生产、交易的效率高、成本低。这样的行业不火,很难。 但计算机、互联网再厉害,还是得靠人告诉他们做什么和怎么做,才能创造价值,服务于人。离开了人,就什么都不是。人既是起点,也是终点。 所谓编程,就是告诉计算机和互联网做什么以及怎么做,就是给计算机和互联网设计工作流程。计算机和互联网的高效率是否能够发挥出来、能够多大程度的发挥出来,取决为他们设计工作流程的人的水平。就好比屠龙刀拿在樵夫手里,只能多砍点柴;拿在张无忌手里,才能号令天下。学编程就是为了学会利用计算机、互联网这两个当今世界的倚天剑、屠龙刀,实现更高、更快、更强的目标。 ## 编程就是做流程 徐老师在课上以银行业务流程为例,非常生动的为我们介绍了编程中最重要的思想,我总结为: “以安全、稳定为前提、以高效为目标的流程意识。” 课上徐老师还通过对银行流程的4次优化,让我们理解了流程的重要性,以及流程改进的空间及方法。作为一个小白,对此的理解定然浅显。以后还通过学习和实际项目加深领悟。 ##人人都是程序员 回味徐老师的讲解,我觉得学习编程不仅是学习编程,更是学习一种方法论。编程中的流程意识何尝不是做人、做事的道理?对安全、稳定、效率的权衡拿捏,不也是为人处世的主要议题吗?那些不就是人生事业中的流程意识吗?对于我们普通人,三分天注定,七分靠打拼,我们就是自己的程序员,事半功倍、人生几何,主要靠自己的编程水平啊。既然人人都是程序员,有什么理由不学习编程呢? 跟着徐老师从JS学起,人生幸事! ================================================ FILE: homework/lesson1/xugaoyang.md ================================================ 【第一次作业】写一篇总结 运用下面这些关键词,把你知道的写出来。 1. 类比代码执行流程 2. 运行环境 3. V8引擎 4. 编译器/解释(执行)器 5. 内置库 6. 第三方库 7. 学习JS的方向 提交方式: 1. 请向getting-started-with-javascript项目发起pull request。 https://github.com/xugy0926/getting-started-with-javascript 2. 文档格式,markdown。 3. 提交homework/lesson1目录下。 ================================================ FILE: homework/lesson1/xuli.md ================================================ # Lesson 1 上课心得-许丽  ## 写在前面 当课程进行到了后1/2,我才来提交lesson 1的作业,其实还真是相当惭愧。 认真分析自己如此拖延的根源在于: 1. 自己的探索能力真心不够,卡在一个环节后,不进行各种方式去自我尝试。 然后就一拖再拖,每天充满内疚感。 2. 自己终究还是表现型选手,不好意思去请教自己觉得太low的问题,然后一个劲地瞎琢磨,学习效率极低! 3. 总是想着,每个人的注意力都那么宝贵,我真不好意思去打扰。其实在再次看了笑来老师关于“贵人”那一期专栏时,我就应该告诉自己,其实求助不等于乞讨。。。 其实都是自己内心想得太多再作祟。谢谢娟娟组队不嫌弃我。终于,我才真正意义上开始了自己的做作业之旅~,这种感觉真好~ ## 关于lesson 1 知识点的理解 ### 类比代码执行流程 第一遍听高阳老师通过`设计银行开户流程`的方式,从而类比代码执行的流程。就在内心表示非常诧异。 以前只是感慨笑来老师的几个类比特别经典,但是现在却是看到高阳老师将类比用得如火纯青的感觉。 当我再重听了几次回放之后,我自认为自己是理解了代码具体怎么执行的,当我想不清楚的时候,我就重新回顾下老师是怎样用银行开户流程一步步地优化出最后的架构来的,然后再将 js代码与用户做替换,将运行环境与开户环境做替换。似乎就慢慢完全理解了。 ### 运行环境 一方面,老师用银行的普通用户开户环境与vip用户开户环境,分别类比为:浏览器运行环境与Nodejs运行环境;另一方面,老师又用婴儿生活环境与小学生生活环境进行同样的类比。 我是直接简单粗暴地理解为代码运行犹如很平常的每一个人做一件事都有其特定的环境一样正常。只是似乎Nodejs运行环境是更高一级的运行环境,而浏览器运行环境更低级一点点。 ### V8引擎 V8引擎包含预处理与执行的模块,我根据老师ppt图片简单地理解为运行环境的一部分,类似银行窗口人员对开户申请单的审查申请与执行申请功能。 根据老师上课时说的话,我甚至又简单粗暴地理解成——对于我们这种初学者纯小白而言,可以暂时不用去管v8引擎到底是如何运作的,它对我而言暂时一点都不重要~ ### 编译器/解释(执行)器 看了其他同学的作业,似乎我感觉我更应该理解老师的意思是让我们理解解释型(JavaScript)语言中的 编译器/解释器。 不知道我理解错了没有。 类比于银行开户流程设计中的 第一个最简版本的流程,其中的窗口工作人员既负责校验格式等初阶工作,又负责审核资质核对征信等高级工作的内容。 似乎可以理解为编译器/解释器做了所有的工作,包括:分析词法、分析语法、分析语义、优化代码、解释代码、执行代码等工作。 因为工作内容繁多,所以运行的效率偏低。 ### 内置库 我依然是基于老师对银行开户的内置服务类比,理解得总是非常简单粗暴。内置库就是为用户的代码提供一些最基本的最常用的内部服务。这个库可以供不用的用户进行调用,类似于一项公共服务,可以节约社会资源。 ### 第三方库 第三方库类似于对内置库,这项公共服务的补充服务,但是是由单独的第三方提供的,有针对性的一些也会经常用到的个性化服务的一种资源。 ## 关于我自己学习JS的方向 直到今天(2017年8月31日),似乎我也不知道自己要学习的JS方向到底是什么,也许会向老师在第六节课内给出对女生的建议一样吧——做前端。 不过暂时倒是没有想过要做个女工程师。暂时的想法是从本职的财务工作,转销售。 希望学习了编程之后,能够提升自己的工作效率~ ## 我还想说...... 感谢高阳老师,特意给我建了一个“准妈妈帮帮团”,还给我一对一远程地指导~ 感谢娟娟同学,组建了一个妈妈帮,让我终于迈出了第二步,进入学习状态,好像我终于不会再那么不好意思啦~ 娟娟昨天微信上问我:讲真,你有没有想过放弃js课程? 我说: 还真不想放弃,这是我最想学成的一门课,虽然落下很多,坚持得有点累,但是,我依然会努力跟上,大不了我下次,下下次再接着上课! 是的,这就是我最想学会的一门课,不像英语,财报那些我多少有点儿基础,而这门课就是我零基础学的,我想,如果我能学成它,以后就不会有太多事儿能够难倒自己了~ 我得加油!我知道, 只要我自己不放弃,我就永远有救! 再次谢谢老师和同学们! ================================================ FILE: homework/lesson1/xuluchun.md ================================================

许路春第一课总结

牢记学习的方向

javascript组成

================================================ FILE: homework/lesson1/xumin.md ================================================ # JavaScript入门第一次作业小结 > 参考:markdown语法 [http://wowubuntu.com/markdown/] > 回顾:pull request [https://github.com/xugy0926/getting-started-with-javascript/wiki/%E7%AC%AC%E4%B8%80%E6%AC%A1pull-request] > PPT课件:[https://github.com/xugy0926/getting-started-with-javascript/blob/master/ppt/JavaScript%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8_%E7%AC%AC%E4%B8%80%E8%8A%82.pdf] ## 第一步,优化流程设计 老师使用银行开户流程设计来类比代码执行流程,通过具体的流程图,帮助我们这些小白更好地理解程序设计的思维方式。 首先搭建整个银行开户流程框架,然后不断优化执行流程,提升整体效率。 通过任务梳理、罗列操作步骤、细分功能,找出可优化的模块;并单独组建新的内置服务模块,从而将预处理和执行模块有效分离;再将银行的操作封装,用户只需通过窗口输入需求,再对窗口的输出反馈。 ## 运行环境 如果银行相当于JS运行环境,用户的开户环境就是浏览器运行环境、Nodejs运行环境。浏览器是普通用户的开户环境,Nodejs是VIP的用户环境。无论普通用户还是VIP用户,他们的运行环境都包含内置服务和V8引擎。此外,还有第三方库,也就是银行本职工作之外的服务,比如保险理财产品之类,有需求可供调用。 ## V8引擎 V8引擎直接将JavaScript代码编译成机器语言,相当于打包成一个可以执行代码的黑盒(内含编译器/解释器),不管是Chrome浏览器,还是Node.js,都经由V8引擎处理。 ## 编译器/解释(执行)器 编译器,把用户需求转换为计算机机器语言,由后台执行处理。特点:代码运行效率高,但是开发效率低。 解释(执行)器,一条语句执行的时候才翻译。特点:开发率高,但是运行效率低。 ## 内置库 内置库提供了可调用的用来实现某些特定功能的便捷服务。比如浏览器运行环境中的JS内置对象、HTTP、WebAPI;Node运行环境中的 Node API等。 ## 第三方库 第三方库是有别于内置库的一个开放的外部资源,不断更新,并为用户提供更好的服务。比如Vue等。 ## 学习JS的方向 JS变化快,范围广(用老师的话说是没有边际的),一入JS深似海。其实我们的学习成长之路也一样是充满变数而又漫长的,所以正好可以把学到的JS思维方式平移到工作学习中。 世界将在我们的探索中更加宽广。 ================================================ FILE: homework/lesson1/yammy.md ================================================ # 第一节 JavaScript 课程总结 今晚在新大学了第一节 JavaScript 课程,以下是课程总结: 1. 类比代码执行流程 徐老师开场用一个银行开户的流程来类比代码的执行流程。 首先,我们知道,开户的大致流程可以分成三个部分: ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-538DBBA6-CAEF-497A-81FE-6EF42874AB76.png) 其中有两个角色,一个是开户人,一个是银行工作人员,图解就是: ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-217BBF8C-E648-4D30-A0C5-F3F28EC48A00.png) 这个流程改进一下,就是分工明细,图解: ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-C5DF1915-72F5-4C10-A4AB-196E4D3B9541.png) 接来下,本着客户是上帝的责任心(并没有),银行还可以优化客户的流程,跑来跑去也挺累的,跑腿的活交给工作人员吧。 ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-1058858C-65AA-4255-A7FE-195CD844C4DB.png) 其实管他工作人员是谁,只要有人为客户服务就好,给我们一个窗口,我们客户只需要坐着填表和检查核对信息就好了。 ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-207C20AF-BD02-43CE-9F2E-2A4CC1A40ABB.png) 是不是还有优化的余地呢?复印查询这样的活儿有人帮忙做就好了。 ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-50D35F8E-356A-41A3-90E1-091FA5428D16.png) 最后抽象一下流程,图解: ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-A033A377-CAB9-489F-8B61-D01CB4EA4008.png) 代码的执行过程也是类似的流程,比如 JavaScript。 ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-C41FEF52-AA4E-4A56-A1D1-59CB1704CDE7.png) 虽然我之前学过 一点 ruby 和 python,通过这样类比的方式,更加加深了我对代码执行的流程的理解。 2. 运行环境 JS 运行的环境有两种,一种是浏览器运行环境,一种是 node 运行环境。 ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-1E381F97-34BB-430F-BC00-1B819DA73C27.png) 这是两种不同的运行环境,就像小盆友和成年人的生长环境不一样是一个道理。 举例来说,浏览器的运行环境可以运行 `alert("hello");`,浏览器执行这段代码会弹窗一个 hello 的警告。 3. V8引擎 V8引擎是 JS 运行环境中的一个重要组成部分,是由Google开发的开源JavaScript引擎,用于Google Chrome中,专门处理JavaScript脚本。 除此引擎外,不同的浏览器都有自己的 JS 引擎,比如Safari的JavaScriptCore引擎,Firefox的SpiderMonkey引擎等。 4. 编译器/解释(执行)器 编译器和执行器是编译性语言的重要组成部分,这种类型的语言先用编译器编译写好的代码,然后用执行器来执行编译好的代码,特点是运行速度快,但开发效率低下,典型的代表是 C 和 C++等,这种语言是机器友好型语言,但对人类不友好。 ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-D9D0EAAC-7872-448D-A372-19BF23079983.png) 编译器和解释器,在解释性语言中的作用是一边编译代码一边翻译代码,最后交给机器去执行,特点是开发速度快,但运行效率低,典型的代码是 Python、Ruby 和 JS。这种语言是高级语言,对人类友好。 ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-82CB61B0-873D-4373-946E-674AD94E83DC.png) 5. 内置库 内置库是 JS 内置的一些库,可以直接拿来调用。 ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-EECE6E12-93CB-4F65-B198-5B04B7BCE3DF.png) 6. 第三方库 第三方库不同于内置库,需要require 才能从外部调用。 ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-EECE6E12-93CB-4F65-B198-5B04B7BCE3DF.png) 7. 学习JS的方向 学习 JS 最好最快的方法是去不断的使用他,让他帮你实现你的想法,解决你的问题,服务你的业务。 ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-C92092ED-7D5D-41DD-AA7B-2933E01F11F7.png) ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-E702EF21-9151-4C53-9DE8-267C32F7AB60.png) ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-08-B9F1BC06-DE2B-41C7-80DB-5CE68F869343.png) ================================================ FILE: homework/lesson1/yangchunguang.md ================================================ ##第一次作业 第一次提交作业,还不懂如何使用GitHub,就当跟它混个脸熟吧。 上编程课给我最大的感受就是,提出一个问题,会引出一堆问题来,这些问题好像没有穷尽,以至于差点放弃。我争取跟上大部队的进度。 感谢高阳老师耐心授课,感觉学不会都对不住老师。 1. 类比代码执行流程 我理解的执行流程是:定义-运行-输出。 当老师用银行开户去类比时,我还想,这个比喻倒挺贴近生活。当进行到优化开户者的使用体验时,我感到编程的思维太牛逼了! 如果能把编程思维用到生活中,那解决起问题来不是要逆天!但是后边一没听懂就泄劲了... 2. 运行环境 我理解的运行环境,就像是鱼生活在海水里,自带了氧气、水、矿物质等元素。代码就是鱼,环境就是海水和海水所包含的元素。 JS的运行环境有浏览器和nodeJS两种。 3. V8引擎 就是代码的处理器。 4. 编译器/解释(执行)器 就是对代码进行翻译和执行的工具。 5. 内置库 供代码调用的功能模块 6. 第三方库 第三方供调用的模块 7. 学习JS的方向 页面、小程序 ================================================ FILE: homework/lesson1/yanglovewo.md ================================================ 【第一次作业】写一篇总结 1. 类比代码执行流程 2. 运行环境:终端,浏览器 3. V8引擎 4. 编译器/解释(执行)器 5. 内置库 6. 第三方库 7. 学习JS的方向:想要完成专门课程,实现从0到0.5. ================================================ FILE: homework/lesson1/yangtieming.md ================================================ # JavaScrip Lesson 1 homework. 对于编译型语言,原始的代码需要经过**编译器**的加工处理,把它先变成**解释器/执行器**可读懂并可执行的代码,然后再交由**解释器/执行器**执行。 这个过程就像我们过年时买回家的半成品年夜饭,所有的食材和佐料是由商家帮我们加工好了,我们自己只要在锅里炒一下就可以了。 商家就是这个**编译器**。我们自己的炒菜行为就是**解释器/执行器**的行为 对于解释型语言,则是将原始的代码直接输入给**编译器/执行器**,由**编译器/执行器**逐条的解释和执行。 这个过程就像一个看菜谱烧菜的人,通常会读懂一步,按照说明操作一步。 假设我们准备的生的食材就是我们自己编的代码。 我们烧菜所需要的锅,铲,煤气灶,油,盐,酱,醋等等烧菜必备的工具和调料就类似于原始的代码**运行的环境**。 假设左边的灶头上只能用来烧菜,而右边的灶头只能用来烧饭。 那么左边烧菜的灶头就像**浏览器运行环境**,而右边的灶头就像**Node.js的运行环境**。 而专门用作烧饭的各种专业锅具就是浏览器的各种内置服务,而专门烧菜用的各种锅具就是Node.js的各种内置服务(**内置库**) 有时家里来了要宴请客人,锅碗瓢盆不够,就向邻居去借,而邻居提供的锅碗瓢盆就像第三方提供的服务(**第三方库**) 家里古董似的老旧灶头火候太小,烧菜烧饭要一个小时,换了新的老板牌燃气灶烧菜烧饭10分钟就搞定,老板牌燃气灶就像**V8引擎**,可以提供大火,快速加热。 然后人类食欲无边,总是不断推出新的菜品,要提高自己的厨艺,就只能不断的学习,这就是**学习JS的方向,无边无际……** ================================================ FILE: homework/lesson1/yangxuewu.md ================================================ # 第一节课总结 ## 1. 代码执行流程 老师通过“到银行开户”这样一个事件需要操作的流程,把用户比作代码,银行内部操作比作运行环境,银行提供的第三方服务比作第三方库。用户与银行以及第三方服务之间的关系,即代码与运行环境及第三方库之间的关系。 用户在开户时,按照银行内部提供的表格填写自己的信息,再交给银行进行处理,最终用户得到开户账户,同时一些第三方的服务会给用户提供各类开户所需要的证明,方便了用户的整个开户流程。 代码的执行流程与此相似。程序员根据运行环境要求编写符合语言要求的代码,运行环境对代码进行处理,最终反馈结果,同时用很多的第三方库方便程序员调用,以更高效的编写代码。 ## 2. 运行环境 运行环境分为浏览器运行环境(前端)和Node.js运行环境(后端)。 运行环境类似于我们人类的生活环境,小孩和大人有着不同的生活环境,老师和学生也有不同的生活环境。每个人只有在适合自己的生活环境中才能更好的生存,否则生活将会很艰难,而代码的生活环境(运行环境)则更苛刻,离开了自己的运行环境,代码将根本无法执行,也就失去了意义。 ## 3. V8引擎、编译器/解释器 V8引擎是Js运行的核心部分。我们所编写的高级语言,本质上计算机是无法直接执行的,需要通过编译器将其编译成计算机可以识别的代码。就相当于说不通语言的两个人需要相互交流,需要一个翻译一样。V8引擎中的编译器就起到了将高级语言翻译成机器语言的功能,使得我们编写的易于人们阅读的高级语言代码能够顺利的转换成人们不易读懂但机器能轻松理解的机器语言。 ## 4. 内置库、第三方库 内置库是支撑我们编写的代码的核心,是我们编写js代码的基础。即只要我们开始编写js代码,不需要任何的操作,就可以使用的方法、函数等都是来自内置库的,例如在老师的演示中使用的`console.log()`,`alert()` 。 第三方库是一些高级开发人员为了方便大家编写代码而基于 JavaScript 开发的库文件,它在js的基础上扩展了其功能,是的开发人员在引用了这些库之后,开发效率更高。第三方库有很多,但在学习的时候不能盲目贪多,应该根据自己的需要选择一个合适的库,然后深入的去研究它,吃透它,让第三方库为自己的项目服务,而不是让自己的项目跟着第三方库跑。 ## 5. 学习JS的方向 1. 学习一门新的编程语言,首先要掌握好这门语言的基础知识,通过一段时间的学习,要使得自己不再犯一些低级的错误,掌握最基本的操作。 2. > 了解和掌握重要的服务能力,使其能服务你的业务。 JS的方法、函数、第三方库有很多,不能盲目的学习。首先要知道自己用这个服务能做什么,能实现自己项目的什么功能,然后从实现自己项目功能这个点出发,利用内置库和第三方库,解决自己的问题,在解决问题的过程中不断掌握重要的服务能力。当能够熟练运用好一项服务/技术时,就需要进入的下一个阶段。 3. > 善于比较服务/技术之间的差异性,用最好的方式实现自己的业务。 即在上一个阶段,为了解决问题,选了一种解决方法,最终解决了问题,之后就应该思考这个问题还有没有更好的解决方法,鉴于js第三方库的种类繁多,解决同一个问题有很多种解决方法,如何区分这些方法的差异性,是快速提高自己的关键。 会用内置库、第三方库是第一步,深入理解内置库、第三库的工作流程是第二步,学会在不同的库之间进行比较,使其能更好的实现自己的业务,是第三步。 4. JS的世界有两大特点。 一是变化快,可能几个月就会出现一个新的库,每年都会有新的JS标准,但在学习的过程中不要害怕赶不上潮流,更不要随波逐流,潮流是永远都追赶不上的,只有深入研究,使其服务于我们的业务。 二是无边际,js本身的创造能力非常强,看看那么多第三库就知道了。但我们再学习的时候一定要聚焦,瞅准一个目标进行深入的研究,而不是陷入js 的浩瀚烟海中无法自拔,最后成为一个对各类库性能如数家珍却根本不会用的人,就像知道所有的车标却不会开车一样。 ================================================ FILE: homework/lesson1/yangyepeng.md ================================================ ## Lession one homework **javascript** ### 1. 类比代码执行流程 以银行开户流程来为例,用户要开银行账户,需要先填写申请表,准备申请资料等信息。 然后申请表和申请资料需要提交给银行大厅工作人员或者窗口工作人员进行资料审核,审核之后再进行开户操作。 这个过程我们抽象出三个步骤 - 资料填写 - 资料审核 - 执行申请 这个过程类比到程序执行的过程就是 - 资料填写: 可以理解为代码编写过程 - 资料审核: 可以理解为代码的编译和解析 - 执行申请: 可以理解为执行代码 资料审核过程的不同,对于效率的影响也不一样。如果资料审核和开户申请一起执行,对应到程序就是解释性的开发语言,它的特性就是程序运行效率低。 很容易理解,如果银行窗口的人员既要审核用户的资料,又要同时进行开户,那么处理的过程就比较缓慢 但是如果资料审核这个过程交由大厅工作人员进行提前核查,那么就相当于做了程序的预处理,也就是对代码进行编译。而这个对应到开发语言就是编译性开发语言。那很容易想象到就是,窗口工作人员的开户效率会大大提高,因为提交过来的资料都是审核过的正确无误的。执行的效率也就非常的高。因此也就很容易理解编译型语言为什么执行效率比较高。 最后,我们知道基本上所有的银行都会把用户分成普通客户和VIP客户,对于两种不同的客户会提供不同的业务和服务。 通过这个例子的类比让我们理解,JS也会分浏览器环境和Nodejs两种运行环境,在不同的运行环境下,会有不同的内置服务和第三方库。 ### 2. 什么是运行环境 前面已经提到JS有两种运行环境,浏览器的运行环境和Node运行环境。 那么什么是运行环境,运行环境是即是程序运行的基础,配套服务,以及能够调用的模块等等。 ### 3. V8引擎 就是相当于一个代码执行的编译器或者解释器。我们可以把它理解为一个程序预处理和执行的黑盒子。 你把程序交给引擎之后,它会把处理结果给你输出出来 ### 4. 内置库 写代码其实就是在调用各种内置的库,不同的运行环境的内置库是会有区别的 - 浏览器的内置库包含JS内置对象,WebAPI, WebGL, HTTP, WebRTC, canvas等。 - Node内置库包含JS内置对象,Node API等 ### 5. 第三方库 第三方库是指由第三方提供的收费或者免费的库。可以理解为别人提供的武器库,拿来就可以用。 ### 6. 学习JS的方向 之前学习Ruby的时候,感觉学的懵懵懂懂,很多概念没理解清楚。 通过徐老师的JS课程,对编程的很多概念和逻辑有了更深入的理解,所以希望通过这个课程促进编程学习的融会贯通。 使自己能在编程这条路上再往前一步,从小白慢慢想着新手,高级新手和熟练运用的方向迈进 ================================================ FILE: homework/lesson1/yanqingmu.md ================================================ # 编程世界类比理解大法 本文是JavaScript编程入门第一节课的作业,之所以起这个名字,是因为徐高阳老师活用类比的方法,重新刷新了我对编程的认知。 过去我学习编程的经历是这样的,翻开一本编程教程,一上来就是数据类型、变量、数组、指针、循环、函数、迭代等等,然后基本就差不多了——差不多到放弃的时候了。所以在编程的世界里我在不停的「入门」,这道「门」很邪乎,每次我一进去就又出来了。 而这节课也让我终于明白到底是哪里出了问题。既然进了「门」就应该往前看,去发现眼前全新的世界,而不是继续盯着「门」看,那只会让自己又重新走出来。所以来一起看看这编程世界到底是什么样子吧。 ### 1.代码执行流程 我把「代码的执行流程」看做是「工业产品化的过程」。通常一个工业产品化的过程包括设计、工艺、采购、生产加工、质保、销售、售后等诸多环节。而代码的执行似乎很简单,只是输入代码然后输出结果。 但实际上程序猿在打代码之前要先构思程序的功能和实现功能的方法,然后把这些思考用代码的方式表达出来,以便计算机可以执行。这跟工业产品设计师做到事情是一样的,设计师同样会根据产品功能要求思考实现方法,然后形成图纸和设计文件,以便后面可以顺利的生产。 区别只不过是计算机把后面生产的过程都完成了而已。这分明是逼着人转行当码农的节奏。 ### 2.运行环境 把注意力集中放在了「环境」这两个字上,可以更容易的理解这个概念。所谓环境,就好比我们去商城购物、吃饭、看电影;去医院看病;去球场踢球一样。商场、医院和球场就是环境,在不同的环境里我们做的事情也是不一样的。 所以当我们听到,浏览器环境是做前端的,Node环境是做后端的,也就没什么可奇怪的了。它们不过是在不同的环境,做不同的事情而已。 ### 3.V8引擎 喜欢汽车的同学都知道,引擎性能越高,车子的动力越强劲。至于是V8还是V12,那都不是重点。既然「V8引擎」是「运行环境」的核心,那么为了更好的理解,我再用医院做个类比好了。虽然在医院这个「环境」下我们行为都是看病,但是在不同的医院看病的效果是完全不一样的。「引擎」强大的医院好比是大城市的三甲医院,而「引擎」弱的医院好比是乡村医院,这体验能一样吗?嗯,肯定不一样啊,听说北京的大医院,挂个号都要找黄牛帮忙。 ### 4.编译器VS解释器 一天BOSS走进办公室,手里拿着厚厚的一摞文件,走到「小编」面前说:小编啊,这些是国外传过来的文件,下班前**全部翻译好**放我桌上。翻译不完,加班!懂了吗?「小编」:哦…… 第二天BOSS又来了,这次他走到「小解」的座位前说:小解啊,中午我要请几个国外的客户吃饭,你来给我当翻译,**我说一句,你翻译一句**。「小解」:好呀!好呀! 嗯,就这样。 ### 5.内置库和第三方库 我们都用过12306买火车票吧,觉得这个网站好用的同学举手。嗯,没人。很好,说明大家是正常人。虽然12306不好用,但是它确实实现了网上购票的功能,我们可以把它当做是实现这个功能的内置库。恰恰就是因为它不好用,所以第三方库一定会出现,比如360、智行等等。从此,妈妈再也不用担心我买不到回家的票了。 ### 6.学习JS的方向 方向感很重要,有目的的学习编程可以让我们知道自己在做什么,并因此保持动力。虽然我还没有这种体验,但是似乎这个逻辑比之前反复「入门」靠谱多了。于是我开始思考学习JS的方向。 > 这个方向一定是自己最想要的做。嗯……如果可以把股票的历史价格输入,然后输出未来股票价格走势,那要发大财了,哈哈,直接屌丝逆袭,赢取白富美了,哈……咳……咳! 友情提示,做白日梦的时候千万不要喝水。 ================================================ FILE: homework/lesson1/yimiao.md ================================================ ### 第一次作业 ## yimiao 学会了java的基本组成: 1. 类比代码执行流程 按照老师的类比,就好像是去银行办卡,先要填写表单(输入代码),然后提交审核(编译器编译),办理业务(执行器执行代码),最终拿卡(反馈结果)。此外,银行还提供了内部服务(内置库),还有第三方公司提供的便捷服务(第三方库)。 2. 运行环境 JS的运行环境,分为两个,一个是浏览器的运行环境,一个是NOTE的执行环境。所谓执行环境,可以看做为了执行代码可以调动的资源总和,包括JS内置配置,内置库,外部库等。 3. V8引擎 V8引擎为JS语言中负责预处理和执行代码的部分。 4. 编译器/解释(执行)器 V8引擎的功能是对代码进行预处理和执行,相当于编译器+执行器. 5. 内置库 每种运行环境中,直接可供应用的内置库,好比直接可以用的轮子和模块。内置库需要初学者花时间精力学习的. 6. 第三方库 每种运行环境中,外部的可供应用的外部资源库。 7. 学习JS的方向 学习js中什么最重要?掌握编程语言最重要,现阶段。 ================================================ FILE: homework/lesson1/yongfei.md ================================================ **类比代码执行流程** * 代码 输入 执行 输出 * 类比:银行开户 申请 检查 反馈 **运行环境** * Javascript的环境,一种是chrome浏览器,一种是Node.js * 类比:婴儿的生存环境 家、游乐场、玩具、食物 小学生的生存环境 家、学校、游戏、体育馆 **V8引擎** 黑盒、用于执行代码 **编译器/解释(执行)器** 1. 分析词法 2. 分析语法 3. 分析语义 4. 优化代码 5. 解释代码 6. 执行代码 编译器/解释器是V8引擎的组成部分 * 编译型:需要一个专门的编译过程,通过编译器翻译成机器语言;特点:运行效率高;缺点:开发效率低。 * 解释型:一条语句执行的时候翻译,特点:开发效率高;缺点:运行效率低。 **内置库** 包括JS内置对象、网络库、日志库等 是运行环境提供的服务。 **第三方库** 由成千上万的公司或个人提供的开源或收费的库。 第三方库是有别于内置库的一个开放的外部资源,更好的帮助我们达成目标,它不断更新,不断为我们提供更好的服务。 **学习JS的方向** 通过练习一个个小项目,达到能独立开发项目的程度。 ================================================ FILE: homework/lesson1/youshilei.md ================================================ #【第一次作业】写一篇总结 ### 1. 类比代码执行流程 用银行办卡业务流程做类比,形象的解释了JavaScript的运行方式。 ### 2. 运行环境 主要是软件环境,有浏览器环境和NODEJS的环境。 ### 3. V8引擎 V8 是 Google 发布的开源 JavaScript 引擎,采用 C++ 编写,在 Google 的 Chrome 浏览器中被使用。 ### 4. 编译器/解释(执行)器 - 编译器 就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。 - 解释(执行)器 又译为直译器,是一种电脑程序,能够把高级编程语言一行一行直接转译运行。 ### 5. 内置库 软件自带的,已经封装过的,可直接调用,提高写代码的效率。 ### 6. 第三方库 可以满足更多个性化需求,弥补了标准库的不足,大大方便了JavaScript的编程。 ### 7. 学习JS的方向 跟着老师,体会编程的魅力,掌握基本的编程技能,不断学习,服务生活。 ================================================ FILE: homework/lesson1/yueruiqi.md ================================================ # 作业1 JS课程1总结 --- **1.类比代码执行流程** 以银行开户流程类比代码执行流程。 - 提交开户申请:对应代码输入。 - 银行的各项服务及内部处理 :对应代码进入编译器/解释器后的各自分析,解释,执行。 - 银行的最终通过/驳回用户的申请 :对应代码最终的运算后的结果。 **2. 运行环境** - 运行环境可以理解位一个可以执行代码的黑盒,按预设的格式输入数据,经过运行环境处理后,最终输出结果。 - JS运行环境,一般包含内置库,V8引擎。 -JS,有两种运行环境,浏览器运行环境,Node运行环境。 **3. V8引擎** - V8引擎,就是JS代码编译成机器可以识别的代码,也就是解析和执行JS代码。 **4. 编译器/解释(执行)器** - JS是解释型语言,边编译边执行,就会用到编译器/解释(执行)器,编译器/解释(执行)器V8引擎的一部分。 **5. 内置库** - 内置库,就是JS运行环境自带的,已经封装好的,常用的功能服务的集合,写代码的时候可以直接引用。 - 需要注意的是知道特定代码是什么含义和用法,还有就是不同运行环境下,内置库可能有区别,某些服务无法使用,或者写出来的代码调用的东西不一样。 **6. 第三方库** - 第三方库,就是相对于内置库而言的,是由个人,公司等组织开发的库,能实现内置库没有涉及到的功能和服务。 **7. 学习JS的方向** - 多练习,先把要实现的需求想清楚,流程列出来,尝试用学到过的代码把这个功能写出来,然后测试运行,挑错,直到能够实现功能。 - 接着,多看相关资料书籍,多问问前辈,看看网上类似的代码,想想又没更好的实现方式,优化代码。 ================================================ FILE: homework/lesson1/yujianke.md ================================================ 1. 类比代码执行流程 --编写代码--编译器分析代码--输出结果。 2. 运行环境 --有浏览器和Nodejs。 3. V8引擎 --对代码的预处理,检查代码是否有错误。 4. 编译器/解释(执行)器 --把高级语言转换成低级语言。 5. 内置库 --浏览器运行环境:JS内置库;WebAPI;WebGL; HTTP; WebTRC; canvas。。。。 --Node运行环境: JS内置对象; NODE API. 6. 第三方库 --浏览器:jQuery; Vue; AngularJS; React...... --Node :EXPRESS; Koa; Webpack; Promise..... 7. 学习JS的方向 --学习怎样调用内置库和怎样使用第三方库。 ================================================ FILE: homework/lesson1/zhanggaoyang.md ================================================ 看了大家的总结,有几篇总结写的非常到位,让人一目了然,但是看到文章末尾发现也是小白,自愧不如。看到大家都是对老师整个讲课过程进行的总结,我决定对讲课思路进行总结。 可以注意到全程都是建立在银行开户流程改进这个类比上的。由一个简单的流程一步一步变得复杂,再通过类比到js,再拆分出每个概念。 老师通过对银行开户流程的一步步改进后的类比让我们一步一步的跟着老师的思路对整个js语言的运行环境的概念有了清楚的了解。比如,当我们不清楚什么是内置库的时候,只要想到银行提供的那些服务就会通过联想达到理解。 在进行解释器和编译器以及浏览器环境和node运行环境的对比,和最后讲学习java时需要考虑到其中服务或技术之间的差异性相呼应。 所以 >对比差异性,掌握你的编程语言,了解那些内置库和第三方库是学习过程成中最重要的事。 ================================================ FILE: homework/lesson1/zhanghuanyuan.md ================================================ 1. 类比代码执行流程 + 就是把现实的事件流程抽象出来,用最精简的方式来描述一个事件的执行流程,方便思考,方便转化为代码。 2. 运行环境 + 运行+环境 + 运行:就是执行代码并期望得到想要的结果。 + 环境:就是生存条件,必要条件;也就是代码执行并能返回结果的必要条件。像老师课件里说的婴儿的环境,学生的环境中除了必要条件(爸爸妈妈等)还有资源这类提高生活舒适度的条件,就好比编程中能有更方便,更快捷,更高效的方式提供。 3. V8引擎 + >V8 作为一个 JavaScript 引擎,最初是服役于 Google Chrome 浏览器的。它随着 Chrome 的第一版发布而发布以及开源。现在它除了 Chrome 浏览器,已经有很多其他的使用者了。诸如 NodeJS、MongoDB、CouchDB 等。 V8 使用了直译的方式,即把 JavaScript 代码直接编译成机器码( Machine Code, 有些地方也叫 Native Code ),然后直接交由硬件执行。 与传统的「编译-解析-执行」的流程不同,V8 处理 JavaScript,并没有二进制码或其他的中间码。 简单来说,V8主要工作就是:「把 JavaScript 直译成机器码,然后运行」 + 顾名思义“引擎”就像是汽车的发动机,可以更快的驱动汽车。V8引擎应该能帮助编程者更快的实现编程目标。 + V8引擎比以前的边解释边执行的效率更高。 4. 编译器/解释(执行)器 + > **编译器** 是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快; 而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的. 这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式) 编译是将源程序翻译成可执行的目标代码,翻译与执行是分开的;而解释是对源程序的翻译与执行一次性完成,不生成可存储的目标代码。这只是表象,二者背后的最大区别是:对解释执行而言,程序运行时的控制权在解释器而不在用户程序;对编译执行而言,运行时的控制权在用户程序。 解释具有良好的动态特性和可移植性,比如在解释执行时可以动态改变变量的类型、对程序进行修改以及在程序中插入良好的调试诊断信息等,而将解释器移植到不同的系统上,则程序不用改动就可以在移植了解释器的系统上运行。同时解释器也有很大的缺点,比如执行效率低,占用空间大,因为不仅要给用户程序分配空间,解释器本身也占用了宝贵的系统资源。 5. 内置库 6. 第三方库 7. 学习JS的方向 ================================================ FILE: homework/lesson1/zhanghy.md ================================================ 1. 类比代码执行流程 + 就是把现实的事件流程抽象出来,用最精简的方式来描述一个事件的执行流程,方便思考,方便转化为代码。 2. 运行环境 + 运行+环境 + 运行:就是执行代码并期望得到想要的结果。 + 环境:就是生存条件,必要条件;也就是代码执行并能返回结果的必要条件。像老师课件里说的婴儿的环境,学生的环境中除了必要条件(爸爸妈妈等)还有资源这类提高生活舒适度的条件,就好比编程中能有更方便,更快捷,更高效的方式提供。 3. V8引擎 + >V8 作为一个 JavaScript 引擎,最初是服役于 Google Chrome 浏览器的。它随着 Chrome 的第一版发布而发布以及开源。现在它除了 Chrome 浏览器,已经有很多其他的使用者了。诸如 NodeJS、MongoDB、CouchDB 等。 V8 使用了直译的方式,即把 JavaScript 代码直接编译成机器码( Machine Code, 有些地方也叫 Native Code ),然后直接交由硬件执行。 与传统的「编译-解析-执行」的流程不同,V8 处理 JavaScript,并没有二进制码或其他的中间码。 简单来说,V8主要工作就是:「把 JavaScript 直译成机器码,然后运行」 + 顾名思义“引擎”就像是汽车的发动机,可以更快的驱动汽车。V8引擎应该能帮助编程者更快的实现编程目标。 + V8引擎比以前的边解释边执行的效率更高。 4. 编译器/解释(执行)器 + > **编译器** 是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快; 而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的. 这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式) 编译是将源程序翻译成可执行的目标代码,翻译与执行是分开的;而解释是对源程序的翻译与执行一次性完成,不生成可存储的目标代码。这只是表象,二者背后的最大区别是:对解释执行而言,程序运行时的控制权在解释器而不在用户程序;对编译执行而言,运行时的控制权在用户程序。 解释具有良好的动态特性和可移植性,比如在解释执行时可以动态改变变量的类型、对程序进行修改以及在程序中插入良好的调试诊断信息等,而将解释器移植到不同的系统上,则程序不用改动就可以在移植了解释器的系统上运行。同时解释器也有很大的缺点,比如执行效率低,占用空间大,因为不仅要给用户程序分配空间,解释器本身也占用了宝贵的系统资源。 5. 内置库 + 内置库JS环境中(浏览器&node.js编程环境中)已经编写好的一些函数方法,可以直接调用而不用重复发明轮子,是提高编程效率的工具之一。 6. 第三方库 + 第三方嘛,应该是相对于内置库来说的。 + 不是当前编程环境中有的,是需要另外添加进来的。 + 第三方库的使用方法还待研究…… 7. 学习JS的方向 1. 学习并熟悉JS编程语言,熟悉语法,学会调用服务(内置库、第三方库)来提高效率。尽快给自己一个正面反馈,加强信心。 2. 理解自己项目的需求,了解并熟悉相关的(重要的)服务。 3. 找不同!比较服务/技术之间的差异,分析其优异性,寻找到最适合自己的方法。 4.JS技术更新变化速度飞快。寻找可复用的经验,加快新技术的学习速度。老师PPT中提到的难度二“无边际”,使我想到avascript无所不能,但要有取舍,要选方向。不能样样了解,样样稀松。 ================================================ FILE: homework/lesson1/zhanglina.md ================================================ ##【第一次作业】 ———————————————————————————————————————— #####--*author:张丽娜* #####--*version:V1* #####--*create_time:2017-08-09* ———————————————————————————————————————— ###1. 类比代码执行流程 ####开篇老师用一个银行办卡的业务流程,逐步优化,衍生出了JavaScript的流程,晚上听完课以后,早上去公司的路上,javaScript的执行过程,我的大脑里面有了一个更清晰的认识,一个形象的类比,让我深刻的记住了js的执行过程,我甚至在思考,如果别人此刻问我,js是什么?我也能清晰的讲明白。高手和普通人的区别就是:高手可以把复杂的过程,用非常直白的话,让小白们都能听懂! ####我对于代码执行流程的理解:程序媛写好的底层的js代码,首先会经过编译环境基础语法的检查(预处理阶段),校验通过之后,js代码被交付给编译器/解释器执行,运行完成之后,会将结果返回给用户。js代码编写的过程中,需要调用浏览器或者是nodejs的内置对象,针对与不同的运行环境,为了使功能更强大和牛逼,提供了可扩展的第三方的类库。 ###2. 运行环境 ####运行环境分为:浏览器环境和NODEJS的环境,在不同的环境中,需要遵循不同的规则,并且不同的运行环境提供了其特性的内置对象,以及针对不同的运行环境,有与之对应的第三方类库。 ###3. V8引擎 ####结合老师的讲解和自己的理解:V8引擎是一门底层技术,chrome就是基于V8引擎构建的,直接的体现就是chrome浏览器中写JS的代码,代码的执行速度快。 ###4. 编译器/解释(执行)器 ####编译器:就是把所有的代码都编译成计算机可识别的二进制文件,这样运行时,计算机可以直接运行,速度非常快 ####解释器:就是执行程序时,将程序逐条解释为机器可识别的二进制文件,编译一条,执行一条,运行效率低,消耗资源大。 ###5. 内置库 ####内置库就该运行的环境下,提供了封装好的,可直接被调用的类,函数、方法。通过访问这些内置的库,极大的提高的编程的效率。 ###6. 第三方库 ####第三方库是针对内置库中的扩展,提供了更加强大和炫酷的功能。合理的使用第三方的库,可以使程序展现更加锦上添花。 ###7. 学习JS的方向 ####跟着老师的节奏,调整自己的心理和身体状态,去掉浮躁和杂念,学习编程的思想,以及解决问题的方式方法,成为一名真正的程序媛,利用编程这门工具来真正的服务生活、解决问题。 ####体会:经过几天的预习,从老师,助教,以及战友们的身上我理解了什么叫敬业,什么叫专业,和一群优秀人共同上路,感觉很荣幸,当然我也在路上。 ================================================ FILE: homework/lesson1/zhangqian.md ================================================ ### 第一课作业 ####1、类比代码执行流程 好比我们去银行办理汇款业务,先要填写申请单,到柜台交给工作人员核对数据,他们在录入系统进行再次比对,然后产出结果,代码执行的流程就是我们把相关语言输入到电脑的软件,软件对输入的语言解析,从而产出你想表述的内容。 ####2、运行环境 编程的运行环境好比人类的生存环境,需要水、空气、食物、衣物及思想,而程序的环境就是具备内置库及处理引擎。 ####3、V8引擎 老师说是黑匣子,对代码进行预处理,对代码进行解析。我认为应该好比华罗庚的泡茶方法论,是一种基于底层原理的处理环境。 ####4、编译器/解释(执行)器 对问题的拆解能力。 ####5、内置库 比如我们需要做一道菜(蚂蚁上树),锅、铲子、灶台就是内置库。粉条和肉末就是代码,人为的翻炒动作就是运行环境里的编译器/解释器,最终成品就是一道美味佳肴。 ####6、第三方库 第三方库就是帮我们更好的完善结果,我们现在正在用的github就是开源的库。还是做菜的例子,想要菜好吃,佐料就属于第三方库。 ####7、学习JS的方向 高阳老师的教学方法很贴近学生,尤其是和同样教授编程课的老师们比,更多的是仔细与用心,建群及助教帮助学生解答疑难问题都是很好的促进学生学习的方式。不管学习任何一门知识,更多的是“师父领进门、修行靠个人"。我最初阶段的学习方向就是紧跟老师步伐,完成每一课作业。明天比今天多知道一些javascript的知识点。 ================================================ FILE: homework/lesson1/zhangruirui.md ================================================ js第一次作业 1.类比代码执行流程 对于js这样的解释性代码的执行流程,我觉得有点像请客吃饭,你和朋友先到了餐馆,点好几道菜,厨房立马看是什么菜,开始做了起来,什么菜先做,什么菜后做,口味是重是轻等等等等,谁知中途有别的朋友知道你俩在这吃饭,于是加入进来,这时你喊来店主加碗筷加菜,新来的朋友不能吃辣,于是还没做的几道菜都给改成清淡的,后厨立马又调整顺序,调整用料,整个饭菜做出来你和朋友们觉得很是满意,于是痛痛快快地吃喝起来。 而对于编译型代码的执行流程,就像一个婚宴的流程,你事先确定好了菜单,到时间了酒店按照菜单来做,基本就不改变菜单了,到时间了就上菜,整个过程基本是固定的,厨师也有各自的分工,因此效率很高,几个厨师就可以准备好几家婚宴。 2.运行环境 运行环境由浏览器运行环境和nodejs运行环境组成,两个运行环境中都有内置库和V8引擎,V8引擎不是我们需要去折腾的,因为这主要是js研发者的事,于是我们折腾的主要对象就是内置库了,而浏览器和nodejs的运行环境中的一个共同点就是都用到了JS内置对象,这是因为两种环境都是用了js来编写代码,都具有js的语言特性,而不同语言之间的差异其实也就是它们的语言特性差异,语言特性不同决定了它们干什么是擅长的,干什么是不擅长的。 3.V8引擎 V8引擎会在程序运行之前,将JS代码编译成机器码,但不是解释执行,更像是对代码做进一步改良,以更好地适应chrome浏览器。 4.编译器/解释器 编译器和解释器分别对应了编译型语言和解释性语言,使用编译器会将高级语言所写的源代码转换成机器能理解的机器代码,而解释器则是将代码一行行地解释运行,而它们各自的优缺点也和编译型语言和解释性语言一样。 5.内置库 将一些必要的JS服务内置在运行环境里,以更方便地使用。 6.第三方库 这世界上开发者很多,很多人将各种功能做成一个库,而我们就可以通过使用这些库来快速实现一些功能。 7.学习JS的方向 学习JS不仅仅是学习一门语言,更重要的是学会用编程的思维,用编程思维来帮助你更好地处理各种事情,比如在学习了变量定义后,你在日常生活中就要学会尽可能地把话说清楚,让你说的话更准确,而不是模模糊糊地只存在于你的脑子里; 而在你初步懂得用编程思维去理解代码后,如果想进一步提高的话,你就需要进一步了解和掌握内置库和第三方库,不仅要学会用,还要学会它们是怎么运行的,这样才能利用好各个库的特性去服务于自己; 正如每种语言都有自己的特性,有自己的优点和局限一样,不同的库,不同的技术都有自己的特性,有时候你埋怨某个库不好、坑爹时,其实很大可能不是库不好,而是你用错了地方,而高手都是懂得去比较各种库和技术的差异性,挑一个最合适自己的。 ================================================ FILE: homework/lesson1/zhangxuedong.md ================================================ # JS第一课总结 ## 类比代码执行流程 代码执行流程类似用户在银行开户: 1.**银行提供开户环境**:提供一组服务包括接受申请、检验申请单信息和核对资格。 2.**内置服务**:帮助用户填写订单提供复印、拍照、查询逾期、查询外国人入境等服务。核心:预处理和执行。 3.**预处理**:在真正执行开户前进行信息检查处理过程,以保证执行处理的效率。 4.**执行**:执行开户并返回想要的开户结果。 ## 运行环境 代码的运行环境有2种:浏览器运行环境和服务器运行环境。 ## V8引擎 对代码进行预处理和执行 ## 编译器/解释(执行)器 编译器对输入的代码进行以下操作:1.分析词义 2.分析语法 3. 分析语义 4.优化代码(其实远不止这4种) 执行器对编译好的代码进行以下操作:1.解释代码 2.执行代码 > JavaScript是解释性语言,其编译器和解释器是一体的(边分析边执行) ## 内置库 浏览器自身提供的库: JS内置对象,WebAPI,WebGL,HTTP,WebRTC,canvas Node.js提供的库:JS内置对象,Node API 共同点:JS内置对象(都使用js来编代码,都提供JS的语言特性。) > 数组、数据对象、数据结构、数据类型、运算符。 ## 第三方库 浏览器包括:jQuery,Vue,AngularJS,React Node.js包括:Express、Koa、Webpack、Promis ## 学习JS的方向 打包(你写的代码,调用内置库,调用第三方库)--> 你的工程代码 换成自然语言就是: “掌握编程语言,用编程方式调用服务来完成你的需求。”这就是初学者的目标。 “了解和掌握重要的服务能力,使其能服务你的业务”这就是提高的方法。 “善于比较服务/技术之间的差异性,用最好的方式实现你的业务”这是近阶的方法。 tips: 可参考黄杰素总结? ================================================ FILE: homework/lesson1/zhaokaili.md ================================================  【JavaScript第一次课后总结】 1.类比代码执行流程 语言分为编译型语言和解释性语言,两种语言对应代码的执行流程自然也不同: 拿敲章来类比,假设现在有一本投标书,要求每页都要盖公章和法人章。 (1)对于编译型语言来说是这样操作滴:先拿起公章,在每一页上都盖好章;确保所有的纸上盖完章后,再拿起法人章,从第一页开始把每一页都盖好法人章。 也就是说把盖章这件事情分成两段:先完成前半部分 盖公章 然后完成后半部分 盖法人章 优点:运行效率高 我中间不用来回切换公章和法人章,盖章速度比较快 缺点:开发效率低 我开始盖第一个法人章的时候才能得到第一个成品(既有公章,又有法人章的一张纸) (2)对于解释型语言来说是这样操作滴:拿起一页纸,盖好公章,然后盖法人章,把盖好章的纸放在一边,接着在下一页纸上盖章。 也就是说把盖章的最终目标(拿到盖有公章和法人章的纸)分成无数个小目标(每一张纸上都盖章) 优点:开发效率高 每操作一次都能得到一张满足要求的纸 都能看见成品的一部分 缺点:运行效率低 每次都要来回切换公章和法人章,速度会比前者慢 2. 所谓运行环境,就是代码的生活环境,以代码类比人来说: 不同的人有不同的生活环境,婴儿和成人的生活环境不同,比如婴儿需要奶粉,而成人需要馒头,米饭;对js来说,则分为两种环境:浏览器运行环境(前端) Node运行环境(后端) 不同的生活环境有相同之处:天空,大地,水,爸爸,妈妈;对js来说:两种运行环境则都有编译器/解释(执行)器(目前基本都用V8引擎)及内置库 当然我们需要注意的是虽然都是天空,大地,爸爸,妈妈,我们所看到的却是不同的天空,大地,喝的是不同的水,感受的是每个人自己爸爸妈妈的爱;对js来说,虽然都是内置库和V8引擎,但是里面实质性的内容却是有所不同的 生活环境里总是我们经常需要的东西,我们可以拿来就用(内置库), 当然有时候我们总想做点其他的事情,而平常的生活环境又提供不了所需要的资源。比如暑假想去美国散散心,我们需要坐飞机,但平常生活中我们并不需要这个工具,这时候就要寻求航空公司的帮助(第三方库)。 对js来说,除了需要可以直接调用的内置库外,还需要偶尔借用第三方库帮助我们更好更快达到目标。 3.学习js的方向 小白:掌握编程语言,知道代码怎么写能让机器根据自己写的代码一步步执行就能输出自己想要的结构 提高:了解和掌握重要的服务能力,知道人家提供给我们的一些工具,代码的作用,性能,知道自己在做哪些事情的时候可以使用这些工具、代码帮助自己更好更快的达到自己的目的 进阶:比较服务和技术之间的差异,知道有多种方式可以到达目的地,能够选择出最佳的方式来完成自己的目标 ================================================ FILE: homework/lesson1/zhaoxiaoxin.md ================================================  【JavaScript第一次课后总结】 1.类比代码执行流程 写代码然后执行,类似在银行提出开户申请然后办理完成一样。 首先有需求,写代码也是为了满足自己的一个需求,就像需要办理开户一样。 办理开户,银行的核心业务是检查信息,批准开户。JS的也有自己的核心业务,执行代码命令。 办理开户,银行会提供一些辅助服务,比如身份证复印、申请单格式核对等。JS里也有内部库可以调用。 办理开户,银行还会提供一些第三方服务,比如身份信息核查等。JS也有一些外部库可以调用。 然后办理开户,普通用户有普通用户的办理环境,VIP有VIP的办理环境。两者的环境有不同之处,也有相同之处。就像JS有浏览器的执行环境和NODE的执行环境,两个环境有不同之处,也有相同之处。就像婴儿的成长环境与小学生的成长环境有不同之处,也有相同之处一样。 上课互动时,有个同学的类比,感觉也很形象。他说前端浏览器的执行,就像我们去饭店点菜一样,后端NOTE的执行,就像大厨在后面做菜炒菜一样。 2.运行环境 婴儿成长有个环境,有爸爸妈妈,玩具,家,商店等,这些都可以看做婴儿为满足自己成长需要可以调配的资源。 js运行环境,分为两个,一个是浏览器的运行环境,一个是NOTE的执行环境。所谓执行环境,可以看做为了执行代码,可以调动的资源总和,包括JS内置配置,内置库,外部库等。 3、V8引擎 就是运行代码的黑匣子 4、编译器/执行器 编译器:把编写的代码语言翻译成机器语言的设备 执行器:执行翻译后的机器语言的设备 5、内置库 存放JS自带的源代码的仓库,帮助我们更方便有效的编写代码。 6、第三方库 外部库,在JS外部,可以在JS编写代码时被调用,用于帮助我们方便快捷的编写代码,存放源代码的仓库。 7、学习JS的方向 小白阶段,掌握JS的代码编写方法,用代码调用服务以便于实现我们的需求 提升阶段,掌握内置库和第三方库的使用方法,用于满足我们的需求 进阶阶段,了解各种内置库与第三方库的差异,以便更好的实现我们的需求。 目前处于小白阶段,最重要的任务是打牢基础,掌握代码编写方法。 ================================================ FILE: homework/lesson1/zhaoyinan.md ================================================ 【第一次总结——初学JS对一些基础概念的总结】 author:赵一楠* version:V1* create_time:2017-08-11* 1. 类比代码执行流程 按照老师的类比,就好像是去银行办卡,先要填写表单(输入代码),然后提交审核(编译器编译),办理业务(执行器执行代码),最终拿卡(反馈结果)。此外,银行还提供了内部服务(内置库),还有第三方公司提供的便捷服务(第三方库)。 2. 运行环境 JS的运行环境分为”浏览器”和”node”,每种运行环境有着不同的内置服务(内置库)和第三方库。这就好比是每个人周边的环境都不一样,有着不同的(有时也有重叠)内置服务和第三方服务。 3. V8引擎 V8引擎为JS语言中负责预处理和执行代码的部分。 4. 编译器/解释(执行)器 应是V8引擎,对代码进行编译和执行。 5. 内置库 每种运行环境中,直接可供应用的内置库。 6. 第三方库 每种运行环境中,外部的可供应用的外部资源库 7. 学习JS的方向 焦点集中在我们写的代码上,我当前的目标就是熟练运用代码,熟练掌握编程语言。 ================================================ FILE: homework/lesson1/zhouhong.md ================================================ 1. 类比代码执行流程 写代码---编译器---解释器---输出 2. 运行环境 相当于银行的开户环境,运行环境就是我们干事请时需要的环境,浏览器运行环境和Nodejs运行环境不同。 3. V8引擎 包含编译和执行 4. 编译器/解释(执行)器 有的语言是编译型,有的是解释型 5. 内置库 属于运行环境的一部分 6. 第三方库 第三方提供服务的 7. 学习JS的方向 先学会写代码,知道自己要想做成一件什么事情。 ================================================ FILE: homework/lesson1/zhouqizhou.md ================================================ # 总结 #### 1.类比代码执行的流程 将代码通过编译器逐条执行,传递系统所需要的参数,完成整个服务 ![](https://ws3.sinaimg.cn/large/006tNc79gy1ficlkyz1qzj30f70cy754.jpg) ![](https://ws3.sinaimg.cn/large/006tNc79ly1ficlmh4s69j30lo09m3zw.jpg) ![](https://ws1.sinaimg.cn/large/006tNc79ly1ficlo8l6u8j30m50ffgnk.jpg) ![](https://ws1.sinaimg.cn/large/006tNc79ly1ficlq4mfjhj30ma0f3myr.jpg) #### 2.运行环境 js 主要运行于浏览器上,不过现在出现node js #### v8引擎 是google 开发的一个代码解析器 #### 编译器/解释(执行)器 把代码编译成二进制 ,计算机只认识二进制。 #### 第三方库 是通过多次的总结归纳,那些经常使用的或者一些很复杂的集合 通过库的方式来调用 #### 学习js 的方向 能完成设计产品上线营销 ================================================ FILE: homework/lesson1/zhouziqi.md ================================================ # 第一次课总结 ## 类比代码执行流程 - 以银行开户流程作类比 - 一步步改进银行开户流程,最终形成与js运行环境类似的流程 ## JS运行环境框架 ### JS运行环境 #### 浏览器运行环境 - V8引擎——用来执行代码的黑盒子 - 内置服务——写代码时能用的内置服务 #### Nodejs运行环境 - V8引擎 - 内置服务 ### 第三方库——从运行环境外调用的服务,大佬们智慧的结晶。熟悉第三方库很有用【虽然现在我还并不清楚有什么用】。 ## 两种语言类型 ### 编译型语言 - 运行效率高,开发效率低 - 执行流程:代码--编译器(分析词法、语法、语义病优化代码)---编译好的代码---执行器(解释代码、执行代码)---输出结果。 ### 解释型语言 - 运行效率低,开发效率高 - 执行流程:代码--编译器/解释器--输出结果。 ## 学习JS的方向 一步步跟着老师走,不懂就搜,搜不到或者看不懂再问。不怕失败不怕麻烦。 ================================================ FILE: homework/lesson1/zhuningning.md ================================================ ### 1. 类比代码执行流程 通过`银行开户流程`来类比代码执行流程:更好的模块化——抽离出常用的功能,单独作为内置服务;将预处理和执行模块分离开来; >开户环境、内置服务、业务核心。 ### 2.运行环境 JavaScript有两种运行环境 >浏览器运行环境: 基于浏览器的 javascript 前端 JS > Node.js运行环境:基于服务端的 javascript 后端 Node.js *** ### 3.V8引擎 * V8是Google开发的开源JavaScript引擎。 * JavaScript 引擎的基本工作是把开发人员写的 JavaScript 代码转换成高效、优化的代码。 *** ### 4.编译器/解释器 * 编译器。主要工作是将源代码编译成抽象语法树,然后在某些引擎中还包含将抽象语法树转换成字节码。 * 解释器。在某些引擎中,解释器主要是接受字节码,解释执行这个字节码,然后也依赖来及回收机制等。 *** ### 5.内置库 内置库 通常都是环境自带的内置服务,提供开发所需的基本功能,包括基本的数据结构,模块,函数,等。 *** ### 6.第三方库 拿来主义,第三方库一般都是指同种语言开发的拓展功能,以满足多样化的需求。 *** ### 7.学习JS的方向 用计算机的思想来武装自己,丰富自己! *** ================================================ FILE: homework/lesson1/zhuting.md ================================================ // lesson1 作业 1. 类比代码执行流程 老师的意思是让我们用生活中的例子来说明代码执行流程吗?第一节课没赶上,只能靠猜测了,补作业,不废话! 首先代码肯定是为了解决问题的,也就是换种语言描述生活中的需要的场景,并能够高效执行的。比如计算器,比如百度搜索关键词JavaScript,以搜索为例子说明 1、用户打开百度网址;此时通过浏览器和和百度服务器链接上了,服务器端收到用户请求,等待用户输入; 2、用户输入关键字JavaScript点击搜索;此时提交了数据,需要服务器端搜索想要的东西 3、服务器端收到用户的关键字后,解析关键字,比如分词等等,然后根据搜索引擎的算法匹配客户需要的数据,并组装数据,返回数据给用户。(此处理过程是用户来说是黑盒的) 4、浏览器返回服务器端数据给客户。用户得到想要的信息或者链接。 2. 运行环境 (我理解是解析代码的程序,我们应该用工具来运行,比如浏览器/JDK/node.js等等,下面的为抄的,目前了解仅限于字面) JavaScript有两种运行环境 浏览器运行环境: 基于浏览器的 javascript 前端 JS Node.js运行环境:基于服务端的 javascript 后端 Node.js 3. V8引擎(更多的时候用浏览器,真没关注过浏览器的实现框架和逻辑) V8是Google开发的开源JavaScript引擎。 JavaScript 引擎的基本工作是把开发人员写的 JavaScript 代码转换成高效、优化的代码, 这样就可以通过浏览器进行解释甚至嵌入到应用中。 4. 编译器/解释(执行)器 编译器:将JavaScript语言转换为机器能理解的二进制代码,机器只能读010101的语言 解释(执行)器 :解析0110101是啥意思,如同人与机器的翻译软件 5. 内置库 使用工具的一部分吧,能够高效处理请求(浏览器)/编译代码(jdk/node.js)等等,都是将一些常用的函数封装,然后方便第三方调用 6. 第三方库 同内置库一样,只是属于第三方,不属于我们使用工具的本身,使用时需要引用 7. 学习JS的方向 当前诉求:看懂别人写的代码,终极目标:实现自己的需求 ================================================ FILE: homework/lesson1/zhuxiaoping.md ================================================ ## **类比代码执行流程** 代码,像是一个【病人】,本身带着需要解决的问题,有着相对明确的目标,最后要赢得【健康】而在特定的运行环境【医院】下奔波。 ## **运行环境** 代码作为一个【病人】必需要去【医院】这个特殊的环境,才能向着解决本质问题的方向前进,但凡进了学校、菜市场根本无法辨识病症,更没办法解决问题。 ## **V8引擎** 【医院】本身的等级三甲,二乙;本质上干的是一回事,就是档次有差,服务体验有差。 ## **编译器**、解释(执行)器 编译器就是【医院】里的各种仪器设备,它们把【病人】通俗的人类民间语言翻译成医疗专用数据,化验单上的上下箭头,B超单上的图片数据等,再由解释(执行)器【医生】解读执行,最终对症下药,给出结果。 ## **内置库** 内置库就是【医院】里各个科室,各自有各自的特长,处理专门的问题,需要哪科去哪科;吃饱了撑着或者土豪全都跑一遍,对于看病也没什么大问题,就是浪费。 ## **第三方库** 第三方库就是【医院】外部相关单位,比如【血站】不是非要用上的,但是多少是相关的。 ## **学习JS的方向** 1、牢固掌握基本知识:编程的语言的基础。 2、借助内置库和第三方库完善自我代码打包,完成任务。 3、对任务目标的不断优化,就如徐老师的银行开户业务,先要优化流程,优化代码,做到精益求精。 ================================================ FILE: homework/lesson1/zhuyongjin.md ================================================  先说说执行流程,老师运用银行开卡的流程,类比介绍了代码的执行流程,运行环境就像是银行。而V8引擎就像是里面的各种库。有浏览器的库,也有Node库。不管是浏览器还是Node库。都是有内置库。然后就外面而言,除了JS库自身的库,还有很多公司在做第三方库。 我们,从内置库或者第三方库调用数据,然后生成一个自己的代码集,然后去执行(V8引擎),生成结果 学习JS的方向就是从内置库和第三方调用库编辑代码,用自己的。 当然,还有编译器和解释器,JS是属于解释器 ================================================ FILE: homework/lesson2/Autumnchou.md ================================================ # 为什么编程中会有丰富化的数据格式 ## 命名 老师用给人命名来类比声明并定义变量、给变量赋值,这是一个含义丰富的类比。 首先只有给人命名了,对人有一个称呼了,其他人才能操纵这个人。这就是声明并定义变量的目的,如果想要操纵、使用变量就要先声明并定义这个变量。 其次一个人的名字就等于这个人吗?当然不是,一个人的名字对应这个人身上的各种属性与关系的集合。一个人的各类属性与具体人之间的差别就是,当人的身高体重等方面有所改变时属性就发生了变化,但是具体的人这个概念不会发生改变。 我觉得这个区分非常重要,编程中我们声明并定义一个变量实际上是在定义这个变量的各类具体属性,而非定义变量的抽象概念。抽象概念不会因为属性的改变而发生变化,但是各类属性的集合是一定会被其中属性的变化所影响的。 ## 丰富的数据化格式 正因为编程中要赋值给变量的是各类属性,所以编程中有多样化的数据格式。 就比如描述一个人的名字要用字符串,身高体重要用数字,是否有好友要用布尔值,喜欢的颜色要用数组;再复杂一点描述一个人就可以用对象,在对象中加入各种属性。 ## 数据 程序的目的是“处理数据,得到结果。” 希望得到的结果不同,需要处理的数据也就不同,因此数据具有相对性。 如果希望得到的结果是身高,那么数据就是具体的身高(170);如果需要的结果是小明,那么数据就是height,weight,student,age,sex var xiaoming = { height:170, weight:90, student:true, age:18, sex:man } [我的个人主页](https://autumnchou.github.io/mywebsite/) ================================================ FILE: homework/lesson2/GaoXianfeng.md ================================================ ## JavaScript 入门第二课总结 ### 现实生活场景举例类比 JS 声明变量与对变量进行赋值 一个男孩,名字为"小明",他自身特征为:身高175cm,体重70kg,性别男,年龄21岁;爱好为:唱歌、旅行;亲戚关系为:爸爸、妈妈、爷爷、奶奶、妹妹等。 判断一个男孩是否是小明时,即可使用上述特征,若上述特征均满足,便可认为这个男孩是小明,否则不是。 在向外界介绍小明时,可说此人为"小明",即,指代上述特征的一个男孩。 由上面描述可推倒出:`小明 = 身高175cm,体重70kg,性别男;爱好为:唱歌、旅行;亲戚关系为:爸爸、妈妈、爷爷、奶奶、妹妹等 的一个人。` 与 JS 中映射,"小明" 为变量名 "xiaoming",小明自身特征、爱好、亲属关系这些特征为 "xiaoming" 这个变量的属性/值; ``` xiaoming = { profile: { height: 175, weight: 70, sex: 1, age: 21, }, hobby: ['travel', 'sing'], relations: ['dad', 'mon', 'grandpa', 'grandma', 'sister'], } ``` ### 变量声明与定义 ``` var name = 'zhang san' ``` 等价于 ``` var name // 声明一个变量 name name = 'zhang san' // 定义这个变量 name,将其赋值为 'zhang san' ``` ### 变量名命名、赋值及取值规则 #### 命令规则:驼峰式与蛇式 ``` companyName // 驼峰式 ``` ``` company_name // 蛇式 ``` #### 赋值规则: ``` // 每行声明一个变量并定义 var age = 10; var name = 'zhang san'; // 在同一行声明并定义多个变量 var age = 10, name = 'zhang san' ``` #### 取值规则: ``` var myFavorColor = ['blue', 'yellow', 'red', 'green', 'black']; // 通过数组下标方式取值 console.log(myFavorColor[0]); console.log(myFavorColor[1]); console.log(myFavorColor[2]); console.log(myFavorColor[3]); console.log(myFavorColor[4]); // 对数组进行循环迭代取值 for (var i = 0; i < myFavorColor.length; i++) { console.log(myFavorColor[i]; } ``` #### 字符串连接 ``` var location = 'Beijing'; var companyName = '新生大学'; var compayBase = companyName + '位于' + location; // 新生大学位于Beijing ``` ps: 字符串与数字相加,结果为字符串 ================================================ FILE: homework/lesson2/JayChen.md ================================================ # HW2 ## 1. 编程中为什么会有丰富化的数据格式 当一个变量被申明时,这个变量就从无到有地诞生了,我个人粗浅的觉得如果能够类比成“怀孕并起名”会更为合适。 我们申明一个变量是为了今后更好地掌控并操作他们,因此在变量刚出现在这个世界上的时候,就需要分门别类地给他们安排一个专门的地方安置,并为今后更好地掌控他们提前做好安排。就好比如果有一个医院负责接生这世上所有的 object,那医院也需要先分门别类一下,人是人他妈生的,动物是动物他妈生的,数字是数字他妈生的,字符是字符他妈生的。。。。。。这样才不会混乱,才能各找各妈、各回各家,方便以后到时间上户口、做普查、划定规则规定某些数字只能在一个小区内打转转。。。。。。当然,听说某些生物还可以强制变种,相当于移民,这是后话。这个医院在接生的时候就把不同种类的宝宝绑上一个随身携带的标签(不会过分细致但是足以对不同的宝宝做区分)以快速归类,并放进合适位置的保温箱,这样就既方便又不会搞错了。 这就是我理解的为什么会有丰富化的数据格式的原因,纯属小白胡乱搜索以后的猜想。 ## 2. github个人页面 https://flyrain78.github.io/page_test/ ================================================ FILE: homework/lesson2/Jaykey_Guo.md ================================================ ### 基础-第二课 ##### 命名 一个名字背后包含很多的属性,有不同的描述,对应的数据表的标题和内容。 JS中采用的是山顶式的命名方法: ```Javascript var userName = "liming"; var isAdmin = true; console.log(userName); /*一个很长的名字*/ var myJavaScriptUserName = { student: name, title: "xxxx", }; ``` 需要注意的是,每一个JavaScript命令结束的时候使用**"*;*"** 在每一个属性之后使用的是**","**来分割不同的属性。 ###### 程序:处理数据的工具,最终得到的对应的结果。 个人JS学习记录网页:https://jaygjianguo.github.io/js-study-record/ ------ 小结: JS的命令格式有自己的特点,需要注意的是结束用分号,一个变量之中的不同属性用逗号,在Node的环境下运行的结果就是对应输出数据。 在变量的添加中,可以直接在原有变量的基础上进行添加,但是必须赋予对应的值,如果只是添加了变量的类型,没有赋予对应值,会出现报错。 JS中的循环与Java类似,都是三个部分完成,*变量;循环长度,递推方式。* ================================================ FILE: homework/lesson2/LiaoYuemin.md ================================================ ## 编程中为什么会有丰富化的数据格式? ### 一切以命名开始 假如没有命名,世界上会发生什么? 你见到我的时候,由于我没有名字,你可能用手指指:“那个女人你过来一下”。但是很不凑巧,在我旁边还站着一个女人,这时我就搞不清楚你到底是在叫谁了。假如我身处人群,周围有一对女人,这时你如果叫“那个女人”,我相信所有的人都会很懵圈,“叫谁呢?” 如果我有名字,故事就不一样了。假如我的名字叫“小明”,即使身处人群,听到“小明”这两个字的时候,我立刻就会反应“是在叫我吧”。 名字的作用在于代指对象,减少冗长的描述带来的麻烦。 我们是如何识别人的? 你有两个好朋友,一个叫“张三”,一个叫“李四”。当他俩同时站在你们面前的时候,你是怎么区别这个是张三,那个是李四的呢?名字只能告诉我们这两个是不同的两个人,但却并不能从本质上把两个人区别开。而真正可以把人区别开的是人不同的属性和关系。比如张三长得很黑,李四要白一些;张三的脸大,李四是小脸;张三不苟言笑,李四活泼开朗。我们的大脑就像计算机处理数据一样,将这一个个特征正和名字做匹配,从而达到区分人的效果。 同理,程序的作用就是处理数据,输出结果。而面对大量的数据,计算机怎么识别这些数据去做相应的匹配呢? 首先需要取名,我们需要申明一个变量,类似给人取名字,当然也是为了方便处理数据。 > var name;//申明一个叫“name”的变量 其次我们需要定义赋值。一个变量只有申明定义了才有意义,才能拿来用。 > var name = “Xiaoming” //定义name这个变量并赋值Xiaoming 在定义赋值的时候,我们又会发现,赋值有多种类别,这就涉及到了数据类型。 ### JS数据类型有哪些? > JS数据类型包括**字符串、数字、布尔、数组、对象、Null、Undefined**。 我们在赋值的时候,我们可以单独选择一种数据类型,可以选择字符串,比如: > var name = "Xiaoming"; 也可以选择数字,比如: >var weight = 170; 我们也可以选择多种数据叠加,比如; > var locationBase = '北京'; > var company = locationBase + '大学'; 还可以定义对象,比如: > var myJavaScriptLessonInfo = { > teacher: name, > tittle: 'JavaScript编程入门', > beginTime: '2017/8/8', > endTime: '2017/9/4' } 数据的多样性决定了数据需要按照一定的规则排列保存,才能方便计算机进行处理。由此涉及到一个数据格式的概念。 ### 什么是数据格式? > 数据格式(data format)是描述数据保存在文件或记录中的规则。 我理解的数据格式就是计算机处理数据的一套公式和逻辑。就像我们的语言中讲究主谓宾,如果你写成主宾谓(日语例外)可能听话者就不知道这句话是什么意思了。 这就是一种数据格式。 再回到标题的问题上来,**编程中为什么会有丰富化的数据格式?** 我觉得这是由数据本身的多样性决定的。丰富的数据决定了需要通过丰富化的数据格式可以满足更多的数据处理需求,节省时间提高工作效率。 *** *我的静态网页* https://chaoshengluchi.github.io/My-first-web/ ================================================ FILE: homework/lesson2/Liuzhengchun.md ================================================ ## 第二次作业 ### 编程中为什么会有丰富化的数据格式 1.这节课老师从*一切以命名开始*讲起,整节课我听的有点懵,脑海里一直带着这样的疑惑“这根编程有什么关系”,尽管我能理解老师讲的字面意思。 后面我看老师在作业区布置作业,我不知从何写起,课程总结就一直拖着没写,后面紧接着第三节课,第四节课就来了。我在把第三节课听完,又 去翻看了其他同学的总结,再回过头看老师的ppt,有那么点感觉了。 编程中的数据格式很丰富,有整数型、布尔值、字符串、数组等等,每种数据格式各有其用处,用在恰当的地方要么可以很好的表达其含义,让人一 了然,要么可以提高处理数据的结果,要么可以和其他数据进行很好的交互,用途多多。重要的是老师在课上提到的“处理数据,得到结果”,还有就 是提高“存储效率、计算效率、传递效率”。 在编程中,我们还会定义变量、函数,通过变量或者函数去操纵其他变量或函数,那么起一个好名字让人记住它,快速找到并调用它就很重要了,不 仅我们自己要能理解它,还要让其他人也能快速看懂。但是名字仅仅就是一个名字,决定它起什么作用的其实是数据,是它里面的数据与其他与其他 的变量产生联系,我们才能得到想要的结果。 2.在github上部署的静态网页:https://l328958741.github.io/my_first_webpage/ ================================================ FILE: homework/lesson2/Rachel.md ================================================ ### 一切以命名开始 整理一下,本次课程老师花了很多心思讲清楚了**变量和数据**之间的关系。 为什么要这么花心思讲变量和数据的关系呢? 因为程序的目的就是**“处理数据,得到结果**”。记得老师在上课的时候说:**数据都要赋值给变量**,程序才会处理它。现在每天我们面对海量的数据,仅仅这些数据无法告诉我们背后的逻辑和故事,那必然需要通过程序去处理它,去解读它。那么我们需要学会用程序可以理解的方式,告诉程序有哪些数据,需要它来帮我们干些什么。 **以下是课程笔记** --- #### 关联名字和目标 小明=一个具体的人 ? **我们是如何识别人的?** 我们大脑是中央处理器,当数据通过眼睛输入给大脑的时候,大脑通过对于特征的认识来分辨别人的。 “小明”对应了一组特征数据,比如属性数据、关系数据。 名字:小明 = 目标:一系列属性和关系 共同对于小明一系列的演化之后,慢慢演进出了一系列的代码。 从文字化方式=>格式化方式=>符号化方式=>伪代码方式描述小明 #### 程序的目的 - “处理数据,得到结果” 不论用内置库,还是第三方库都是帮助我们处理数据,快速解决问题,得到结果。 #### 数据、变量 变量 = 值(数据) 比如变量为“身高”,值为“170”,值**都**需要赋值给变量。 集合数据/数组数据 #### 代码 **var** output = "Hello, JS"; => **var** output; #**声明**一个变量"output" ​ output = "Hello,JS"; #**定义**这个变量,并给它赋值为"Hello,JS" #### 实际操作 ================================================ FILE: homework/lesson2/Risexie.md ================================================ 代码中为什么会有丰富的数据格式 ===== ### 用“起名”作类比 老师在课程内容当中,用了较大一部分的时间来把代码“声明“和“定义”的过程与我们给婴儿起名作类比。 而在我把“声明“,”赋值“和”起名“对应起来理解之前,我们可以先分析一下这三个例子,其实是想说明什么? #### 名字的作用 我们人类在指代一个物体之前,我们都会给这个物体,或者事物赋予一个名字。例如把我们还没起名字的孩子,叫宝贝。如果我们不把物体赋予一个名字,我们就很难去描述它。 例如我们会用杯子,来形容这个在桌子上体积为64立方的透明且中空的玻璃制造的圆柱形物体,名字可以非常方便地帮助我们来指定一个物体。 #### 名字与杯子之间的关系 同样使用上方的例子,我们把哪个“在桌子上体积为64立方的透明且中空的玻璃制造的圆柱形物体”叫做杯子。但是杯子有不同的大小、形状、材质。 我们可以把前方所提的物质叫做杯子,但如果只提“杯子”就不足以和前方的物体对应起来。“在桌子上体积为64立方的透明且中空的玻璃制造的圆柱形物体”和“杯子”的关系 是充分不必要的。而如果想讲两者对应起来,我们就需要更多的信息和条件。 #### 如何关联名字和目标 我们是如何将“在桌子上的物体”和杯子对应起来的? 如果光是“杯子”这个名词本身,我们可能会想到了保温杯、陶瓷杯、塑料杯,等等。但如果我们加上“体积为64立方的透明且中空的玻璃制造的圆柱形物体”这些条件和信息,我们就越能准确地指代一个事物。 当别人提起一个名字,我们脑海中回想起来的往往是这个人的相貌,身材,声音,走路的方式等等。可见我们是更多通过其他方面的信息,才真正把这个人和他的名字对应起来的。*想起一个人,我们对应的其实是大量的数据。* **所以如果我们想要准确地将“名字”和“目标对应起来,我们就必须要给目标添加很多的属性、数据。来将这个目标具体化,而这个过程其实就是”赋值“。** ### 给计算机输入输入数据 在JS当中,我们是这样子来输入一个数据的。例如:`var name ='Risexie'`, `name`是这个变量的名称,而`Risexie`是这个变量的定义。 `var name ='Risexie'`这一行代码的含义,就是先声明一个叫做name的变量,然后将这个变量赋值为Risexie。 #### 当然变量定义的形式有很多种,可以是一个数值,可以是一个字符串,可以是字符串组。 `var Thenumberilike = 18 `  数值 `var Thecolorilike ='白色'` 字符串 `var TheMusiciansilike =['陈奕迅‘,'张敬轩']` 字符串组 #### 当我在上面‘声明’并‘定义’了这些变量,我就可以使用它了 `var ThethingsAboutme = {我喜欢的数字:Thenubmerilike ,我喜欢的颜色:Thecolorilike,我喜欢的音乐人:TheMusiciansilike,}` `console.log`这个代码其实就是输出它后方数据的意思 例如`console.log Thenubmerilike` 计算机就会输出18   `console.log ThegthingsAboutme` 计算机就会输出:我喜欢的数字:18,我喜欢的颜色:白色,我喜欢的音乐人:陈奕迅,张敬轩 #### 当然输出不一定要先定义,直接输出也行 `console.log('--------------------')` 计算机输出-------------------- `console.log ('\n') ` 计算机输出:两行空白 `console.log ('我是五个字') ` 计算机输出:我是五个字 #### 如果我们定义了一个字符串组变量,我们甚至可以用游标来输出他们 `console.log TheMusiciansilike[0]`; `console.log Themusiciansilike[1]`; 计算机输出:陈奕迅;张敬轩 **由此可见数据的格式可以有非常多种,而数据又可以嵌套数据。** 而这种丰富华的数据格式,可以让我们一边输入数据,同时又使用它。如此一来,只要我们最后将这些数据打包,就可以非常方便地调用这些我们输入的数据。     ================================================ FILE: homework/lesson2/SunBo.md ================================================ # 编程中为什么会有丰富化的数据格式 > 孙博首次布属的静态网页:[https://ziyoubenteng.github.io/My-space-test/](https://ziyoubenteng.github.io/My-space-test/) *** ## 第一部分-各种数据格式举例 数字 var age=18; 文本 var locaitonBase = '北京'; 布尔(真与假) var student = false; 对象 var myJavaScriptLessionInfoObj = { teacher: name, teacherWeChat: wechat_user_name, title: 'JavaScript编程入门', beginTime: '2018/8/8', endTime: '2018/9/4', boysStudent: 417, girlsStudent: 119, lessionTarget: '帮助更多小白学习JavaScript', githubUrl: 'https://github.com/xugy0926/getting-started-with-javascript' }; 数组(有length,可通过游标表示数组中的相对应的值) var myLikeColorsList = ['blue', 'green', 'black', 'white']; ## 第二部分:为什么会有丰富化的数据格式 * 几乎世界上所有的事物者是需要分类的,数据格式也不例外。 * 语言的词汇需要分类,图书检索需要分类,程序中的“数据格式”也需要分类,我认为“丰富化的格式”的本质就是一种分类。 * 分类让我们所见的世界更清晰,更透彻,更便捷了。编程语言在执行过程中,程序员在编写过程中,丰富的数据格式让复杂的工作变得有章可循,让程序员的智慧通过驾驭各种恰当丰富的数据格式而实现。 ================================================ FILE: homework/lesson2/WANG XUANDING.md ================================================ 首先申明一点,我极度讨厌那种为了凑字数而大段大段复制黏贴百科注释的行为。同时,我遵循如无必要,勿增实体的原则,就是几句话就能说明的东西,绝对不鬼扯。 ———————————————————————————————————————————————————————————— #编程中为什么会有丰富化的数据格式? 关键词,丰富化,数据格式,故而可从两方面入手分析 ##1.为什么会丰富化 [字符,字符串,布尔,整形,浮点,其他。。] 如果没有丰富化的数据格式,会是怎么样的?程序不知道我们要求输出的a是a所指代的值还是a这个字母,或者字符串。同样的,0和1到底代表什么,当为了表达T/F时,应当把他们定义为布尔,当只是为了表示数字时,则是整形/浮点。由于计算机本身并不认识数字,所以我们人为的分割出整形和浮点。即使我们输入一个为整形的3.9,那么它对于计算机也只是代表3,而浮点型的3则代表3.0。 每一种数据格式都是为了满足人对于程序的特定的需求才有的。由于人编程的目的是为了服务自身,而工具的多样性、全能性对于办事效率来说是一个重要指标。由此,可得到不同类型的数据格式表示着人对于它的需求,可能是刚需,也可能能通过其他首先去实现,但是会比较麻烦,但是毕竟人是追求效率的。 ##2.为什么有数据格式 不知道有没有理解错误,如果把数据名称叫做x,那么数据格式就是x所指代的东西。可以是之前所提及的几种类型中的任意一种。如果要让x在数学运算中有意义,那么就需要给予x一个具体的形体,而不能单单只是一个未知量。5x如果x没有数据格式并没有意义,相反,如果x是整数/浮点,则机器能知道5x是个数字,如果是字符,则知道5x是字符串。数据格式的意义就是让程序能运作起来。 ================================================ FILE: homework/lesson2/WangChangQing.md ================================================ # 编程中为什么会有丰富化的数据格式? ## 1. 我的理解 编程中为什么会有丰富化的数据格式?因为编程中需要有丰富化的数据格式呗。 所谓“计算”,就是运用一定的规则,处理复杂的数据,得出一定的结果。所以“数据”很重要。 那么数据首先一定会包含单纯的数字,比如“1”、“3”、“10086”等等。这是最广泛的计算需求。 广义的“数据”还会包含文字,中文、英文,因为需要进行排列、组合,包括一定的说明和解释。 因此,数据格式一定会包含“数字”和“字符串”(也就是除了数字之外的文字)。 除此之外,数据还会包括“是(TURE)”和“否(FALSE)”。这样计算机才知道什么是对的,什么是错的,什么时候应该继续往前走,什么时候应该调头。 ___ ## 2. 高阳老师的范例代码 从高阳老师提供的范例代码中可以看到,类似于数学和物理,在计算之前,往往需要明确一系列的变量,以及变量的值。这样就会大大提高计算的效率,减少重复的输入,也可以让计算过程更加简洁、明了。 范例中定义了“变量”和“对象变量”两种变量,有数据、数组、字符串等等,“对象变量”包含相对比较多的内容和数据。 `console.log` 是“输出”, `console.log('\n')` 似乎是“空行”; `console.log(某变量)[0]` 是从数组的第一个开始输出, `console.log(某变量)[1]` 是从数组的第二个开始输出; > for (var i = 0; i < myLikeFoods.length; i++) { > console.log(myLikeFoods[i]); > } 这个的意思是:定义了一个i变量,将其赋值为从0开始的循环,i小于“myLikeFoods”这个数组的长度(长度也就是数组所包含数据的数量),i++不知道是什么意思,然后将i代入列表输出的`console.log(某变量)[0]`,就可以实现一个列表的输出了。 后来,范例重新定义了“xiaoming”这个变量,并做了输出。 后面又定义了一个“xiaoming2”,展示了一下语法糖的用法。 ___ ## 3. 我遇到的问题 主要还是静态网页的index文件不知道怎么修改,在浏览器的“检查”中做了修改和“另存为”之后,界面的排版有些乱,所以有些迷茫。 其次,不太清楚如何把JS代码放到浏览器的运行环境下执行,“复制”“粘贴”之后就不知道怎么做了。 **静态网页地址:** https://wcqxmu.github.io/JAVAScript/ ================================================ FILE: homework/lesson2/WuGaoxing.md ================================================ 编程中为什么会有丰富化的数据格式? 编程是一个代码的世界,编程中的各种丰富数据和逻辑关系,代码来源于生活而有高于生活,生活的丰富多彩除了说写拍电影等来记录外,还可以通过代码来记录和演示,生活有多精彩数据就有多样的丰富,数据格式是与人类现实生活的参照和对比,同时又有现实世界中寻不到找不着的东西或逻辑,但是通过代码能够提现出啦,故编程世界中一定会有丰富化的数据格式,且远远不断的会丰富下去。 github上的静态网页:https://5glad.github.io/one/ ================================================ FILE: homework/lesson2/Zhengchao.md ================================================ # **JavaScript Lesson2 学习心得** [JS网页教程](https://www.w3schools.com/js/default.asp) ###### 第二课作业提要:“编程中为什么会有丰富的数据格式?” ### JS包含了多少数据格式(DataType) - 数字(numbers),文本(strings),布尔(booleans),对象(objects),函数(function),数组(arrays),日期(Date),undefined和null; - 数组和对象都包含了多个数据,不同的是,数组内的数据,同属于一个类型,比方说苹果,香蕉,葡萄;而对象内的数据,可以理解为一个由不同种类的数据构成的集合,比方说年纪,身高,体重,婚否等; - 值得注意的是,空值属于文本,未赋值属于undefined; - 数组使用的是方括号[ ],对象使用的是大括号{} ### 为什么会有丰富的数据格式呢? - 数据的格式(DataType)是数据的部分属性,举例:16可以是数字(numbers),也可以是字符串(Strings);前者可以结合运算符(operator)做数学计算,后者可以当成字母来看待,如车牌号(var carNumber = '吉' + 'AW' + '18' + 'K' )。顺带说一句,JS代码的执行器默认不处理空格的,空格只是为了增加代码的可读性。 既然同一个数值可以用不同的角度去解读,那么定义好它的格式则显得尤为必要。 ### 浏览JS网页教程,列举如下知识点 - JS内的数据格式总是64位的浮点格式,即不分整型,长整型,短整型等; - 不常见的运算符 ,如:x += y ; - JS Style Guide很重要,比如【以分号‘;’结束一个简单语句】;【不以分号‘;结束一个复杂语句】;【以分号‘;’结束对一个对象的定义及赋值】; - JS不支持连字符‘hyp-hens’,区分大小写(caseSensitive) - 变量分两种,Global 和 Local ### 我的静态网页 [郑超的JS学习站](https://github.com/Tal170809/JSNote) ================================================ FILE: homework/lesson2/baoguoqiang.md ================================================ # 编程中为什么会有丰富化的数据格式? ## 首先什么是数据格式呢? 我个人理解数据格式就是数据类型; - 在编程语言中,能够表示操作的值的类型称作数据 类型,编程语言最基本的特性就是能够支持多种数据类型(数据格式)。 - JavaScript的数据类型分为两类: 1.原始类型(数字、字符串、布尔值、null、undefined); 2.对象类型:除了数字、字符串、布尔值、null、undefined之外的就是对象了。对象是属性的集合 ## 为什么会有丰富化的数据格式? 每个属性都是由“名/值对”构成 ;(值可以是原始值,比如数字、字符串,也可以是对象) 随着值的不停的变化,属性也在变。 不同的对象我们要定义不同的值,所以就会变得丰富化。 我的静态网页url:https://baoguoqiang123.github.io/xinshen/ ================================================ FILE: homework/lesson2/caozhen.md ================================================ ## 编程中为什么会有丰富化的数据格式 ### 程序中的各种数据,都是对客观世界的反映 - 人类与其它生物相比的最大优势就是人类具有学习能力+逻辑思维能力 - 为了将自己从简单机械的劳动中解放出来,使自己的生存环境更加方便舒适,人们开始探索并创造 - 在客观世界中,人们制造各种设备 - 而在虚拟世界中,人们创造了程序语言,描述并反映客观世界 ### 客观世界是丰富多彩的,包括各种各样的内容(数据) - 数字 - 字符 - 单字符 - 字符串 - 逻辑值 ### 以上内容又可以组合 - 数组 - 列表 - 字典 - 类&对象 ## 我的静态网页地址 https://caozhens.github.io/Javascript_Learning/ ================================================ FILE: homework/lesson2/chengjun.md ================================================ ## 编程中为什么会有丰富化的数据格式?程君的第二课作业(补交) ### 编程是什么? 要想知道编程世界中为什么会有丰富化的数据格式之前,我们需要首先知道编程到底是什么? 在我的思维里,编程就是用计算机能够读懂的语言,让计算机帮助我们处理数据并得到结果。那么计算机在处理数据时如果能进行一种分类,就可以快速的进行处理。 比如我们也会把现实世界的物质进行分类,当我们运用逻辑思维时经常会调用MECE方法来进行分析,而应用这种方法的分类就可以让我们无遗漏、无重复的进行分类。 因此,计算机面对的数据千变万化,在让计算机处理数据之前,对数据进行分类,使之拥有各种不同的格式,只是为了让计算机更加方便的去读懂,去调用。 ### js都有哪些数据格式? 通过目前的学习,我了解到JS中分别有 > 数字、文本、布尔、对象、数组、函数 #### 分别事例 数字 > var age = 18; 文本 > var locaitonBase = '北京'; 布尔 指代真假、开关、是否 > true 或者 false 对象 是由若干名/值对组成的映射表,名/值对中间用;分隔,名/值对之间用,分隔,整个映射表用{}扩起来。 > var myJavaScriptLessionInfoObj = { teacher: name, teacherWeChat: wechat_user_name, title: 'JavaScript编程入门', beginTime: '2018/8/8', endTime: '2018/9/4', boysStudent: 417, girlsStudent: 119, lessionTarget: '帮助更多小白学习JavaScript', githubUrl: 'https://github.com/xugy0926/getting-started-with-javascript' }; 数组 > var myLikeColorsList = ['blue', 'green', 'black', 'write']; 函数 相当于一个黑盒子,黑盒子只被定义一次,就可以被调用任意次。 > function personA() { console.log('1'); } *** #### 程君静态网页请[点这里](https://qiezijun120.github.io/test/)访问主页 ================================================ FILE: homework/lesson2/chenguoqiang.md ================================================ # 编程中为什么会有丰富化的数据格式? 数据格式这个概念,我是第一次听到。百度了一下它的概念 > 数据格式是描述数据保存在文件或记录中的规则。 > > 形式:数值、字符或二进制数 虽然第一次接触,但是通过徐老师的讲解,理解起来并没有什么难度。把“数据格式”相信成一个人,人会有各种各样的需求,吃喝玩乐丰富多彩,这就不难理解,为什么会有丰富化的数据格式。这只是我自己的粗浅的理解,不知道理解的对不对,还请老师指正。 ### 下面是我最近学习的一些感悟 第一次学习编程就碰到这么认真的老师,手把手的教,真的很幸福。我总结一下我学习过程中碰到的一些问题。 刚开始的时候“>",以为这个也是代码的一部分,导致输入的时候,终端里面一直没有反应。现在我知道了,这个符号是来告诉你这是一条指令。空格和要用英文的双引号,我觉得倒不是什么大问题。 实操过一遍git后,再去看教程,会清楚很多。当时的感觉就是两眼一抹黑,文字都认识,就是不知道说的是什么! > 从Github上克隆一个项目仓库到本地项目仓库。 `git clone url` > > 修改项目。 > > 添加修改到本地仓库的缓存区域。`git add -A` > > 把缓存区域的修改提交到本地仓库。`git commit -m "some logo"` > > 将本地仓库的提交推送到到远程仓库。 `git push origin master` 我回顾了一下群里的聊天,我问过的那些问题,仅仅过了几天时间,再去看那些问题都好幼稚。自己查一下基本都是可以解决,只是缺少了一些耐心,教程多读几遍都是可以解决的。 当我们面对未知的时候,多少都会有些“恐惧”心理,尤其是我回头看我自己问出下面这个问题,其实我只要自己勇敢的迈出第一步,就不会有下面这个问题。 当时我问了一个问题【”Pull request“,是不是就是”git“的实战?就是流程一样?这个作业不知道怎么下手。】 问这个问题,是因为自己没有看教程,因为不太懂,心里有些着急,所以就着急在群里问了,实际上,自己多看几遍教程,就可以解决问题。遇到不懂的一定要自己先去找答案,切记切记。 静态网页 https://chenguoqiang007.github.io/study/ ================================================ FILE: homework/lesson2/chenqiong.md ================================================ # JavaScript 入门课第二课总结 ## 使用 GitHub 免费生成静态网页的技巧 * 第一步:在 GitHub 上创建一个空项目,然后 git clone 到本地。 * 第二步:把写好的 HTML 页面复制到本地项目,git add ,git commit ,git push origin master。 * 第三步:回到 GitHub 找到刚才创建的项目,此时项目里面已经有 HTML 文件了,Settings,GitHub Pages,选择 master branch, save。 * 以后如果要修改,只需要在本地改好,push 到远程仓库,稍等片刻,就可以看到改动后的效果了。 * 我运用此方法,成功迁移了一个可以提高同事工作效率的工具,虽然还需手动添加信息,但是后续会尝试迭代 https://jacksparrow008.github.io/work/ ## 一切从命名开始 ### 变量命名的原则 * 变量名区分大小写,允许包含字母、数字、美元符号($)、下划线,但第一个字符不允许是数字,不允许包含空格、其它标点符号、中文。 * 长度尽量短,抓住要点。 * 避免使用无意义的变量名。 * 禁止使用 JavaScript 关键字、保留字命名。 ### 驼峰命名法 当变量名和函数名由两个或者两个以上单词构成时,利用"驼峰式大小写"来表示,以增加变量和函数的可读性。 * 小驼峰式命名法:第一个单词首字母小写,后面每个单词的首字母都大写。例如:myLikeColorsList、locaitonBase。 * 大驼峰式命名法:每一个单词的首字母都采用大写。例如:FirstName、LastName。 * "驼峰式大小写"命名规则只是一种惯例,并没有绝对与强制,只是为了增加代码的可读性,降低后续维护难度。一旦设置并确定命名规则,在编写代码时应该保持格式的一致性。 ### 不管采用何种命名方式,前面的四条原则必须遵守 ## 创建一个变量的步骤 声明变量 -- 定义变量 -- 给变量赋值 ``` javascript var name = 'xiaoming'; ``` ``` javascript var name; name = 'xiaoming'; ``` ## 人脑要识别一个人,首先要通过感官系统观察,如果与之前存储在记忆里的信息匹配,才能认出一个人,电脑也一样,声明了一个变量之后,必须定义并给变量赋值,这样电脑才能识别并使用这个变量。 ================================================ FILE: homework/lesson2/chenrushan.md ================================================ # Lesson02 总结 > 程序的目的是什么? > > **处理数据,得到结果** 为了处理数据,操作数据,就需要先对其进行命名,然后将名字与数据关联起来。 # 名字 > 一切从命名开始 先取名 -> 生小孩 -> 名字与孩子关联起来 第一步是先取名字。无论是小名、大名还是宝宝,我们都会对孩子有个称呼。就如万物都有各自的名字。 我们是如何描述一个人的?通过描述他的各种属性。 比如,我的朋友小白,他身高175,体重120,今年18岁,他有爸爸、妈妈、妹妹、爷爷、奶奶… 我们回忆一个人的时候,在我们脑子里搜索到“小白”,然后读取数据,读取的就是这个人的各种属性特点。 “小白”这个名字,在我们脑子里,代表的就是各种属性的集合数据。 # 数据 > 数据很重要 ## 描述数据的方式 为什么我们投简历的时候不是写一篇长文章来介绍自己,而是分类、用比较格式化的形式来呈现? 因为后者更清晰,大脑处理起来更快嘛。 同理,用一定的格式去描述数据,程序处理起来更快。 ``` 小明={ 属性:{ 身高:170cm, 体重:70kg, 性别:男, 年龄:18 } 关系:{ 家庭:[爸爸,妈妈,爷爷,奶奶], 闺蜜:[], // 没有闺蜜 空值 同学:[a,b,c], 邻居:[s,m] } } ``` 丰富的数据需要多样化的数据格式(type)。 身高、体重和年龄,用数字描述;性别用字符串描述;家庭、同学等有多个成员,用数组描述;身高、体重等具体的数据,可以打包成“属性”,成为组合性数据,用对象描述;等等。 ### JavaScript的数据类型 JavaScript中,数据,或者说值(value),有多种类型(type),除了原始类型Primitive type),其他的都是对象类型(object type)。 - 原始类型(Primitive type) - 数字(number) - 字符串(string) - 布尔值(boolean) - 空(null) - 未定义(undefined) - 符号(symbol) - 对象类型(object type) - 数组(array) - 函数(function) - … More: - [JavaScript 数据类型和数据结构 | MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures) - [标准库中更多的对象 | MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects) # 名字和数据(变量和值)的关系 在程序中,变量(variable)就是前面说的名字,用来存储数据,也就是值(value)。 ![variable & value](https://ws3.sinaimg.cn/large/006tKfTcgy1fs7i33lb73j30r80jodnh.jpg) # 变量先声明,再定义 > 先声明,再定义(赋值只是一个过程) 先声明一个变量,再定义这个变量,给这个变量赋值。 ``` var output = "Hello, JS"; // 等式左边是变量,右边是值 var output; // 先声明一个变量,变量名叫 output(此时变量的默认值是undefined); output = "Hello, JS"; // 再定义这个变量,给这个变量赋值("Hello, JS")。 ``` # 阅读代码 1. string的引号,双/单引号都可以,尽量用单引号。(注意:不要混淆,JSON中必须用双引号) 2. 定义多变量时,可集中在一行,逗号隔开。eg. `const height = 170, weight = 120; ` 3. 关于命名的惯例,有camelCase(lowerCamelCase),PascalCase(UpCamelCase)等等。具体应用偏好,可参考热门代码风格指南[Airbnb](https://github.com/airbnb/javascript/blob/master/README.md#naming-conventions)、[Google](https://google.github.io/styleguide/jsguide.html#naming)。 4. 声明并定义了一个变量,就要去使用它,操作它。 5. 当“+”运算符用在字符串和变量之间时,如果变量是字符串,则连接两个字符串;如果变量是数字/布尔值,则转化为字符串,与字符串连接。(参考[Addition | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Addition))。常用的字符串操作,还有用`string.length`查询字符串长度等(参考[String | MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String))。 6. 数组,参考[Array | MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array)、犀牛书第7章。操作数组,用索引读取数组元素,遍历数组元素,可以用`for循环+索引`(较灵活),也可以用`forEach方法+匿名函数`、`for…of`遍历。参考[JavaScript 的所有循环遍历方式](http://xugaoyang.com/post/5a62fb1d1d92b0371315ab35)。 7. 转义字符,参考犀牛书3.2.2。`\n`是换行符。 8. 对象,参考[Object | MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object) 、犀牛书第6章。对象常见的用法是创建(create)、设置(set)、查找(query)、删除(delete)、检测(test)和枚举(enumerate)它的属性。对象属性的值,除了可以是基本数据类型之外,也可以拷贝其他变量的值。 9. 语法糖(Syntactic sugar),属性的简写。在ES6中,当属性名和局部变量名是一样时,我们可以省略它后面的冒号和值。参考[重新认识ES6中的语法糖 | segmentfault](https://segmentfault.com/a/1190000010159725#articleHeader0)。 ================================================ FILE: homework/lesson2/chenziwen.md ================================================ # 第二课作业 ## 作业要求 1. 熟读getting-started-with-javascript/study/lesson2/smaple_code.js代码。 2. 用node环境和浏览器环境运行一下代码(注意:浏览器运行请使用my_personal_info_page.html) + node环境与浏览器运行的输出结果是一致的,但是显示上是有差异的. + 差异: + 相同部分:"基本信息";"兴趣爱好";"课程信息". + 不同部分:从"JavaScript课程信息"后开始,浏览器把输出结果包含在"Object"中,其后还显示"get 变量名:reactiveSetter()","set 变量名:reactiveSetter(newVal)",目前不了解这样显示的目的是什么,以后有时间再进一步了解,先赶上课程进度!;node环境则是直接在终端按数据结构输出变量和值的结果. 3. 问题:编程中为什么会有丰富化的数据格式? + 回答: + 因为世界是丰富多样的,在映射到计算机系统里就有了丰富化的数据格式,计算机语言设计者又把多样的信息数据归纳为几个大类,由简入繁,由少到多. + >计算机程序的运行需要对值进行操作.在编程语言中,能够表示并操作的值的类型称做数据类型. + >JavaScript的数据类型: >>原始类型 >>>1. 数字 >>>2. 字符串 >>>3. 布尔值 >>>4. 特殊值:null和undefined >>对象类型 >>>Object:对象是属性的集合,每个属性都由"名/值"对应 >>>特殊对象: >>>>**数组**,表示带编号的值的有序集合. >>>>**函数**,函数是具有与它相关联的可执行代码的对象,通过调用函数来运行可执行代码,并返回运算结果. ## 附加作业要求 1. 在github上部署自己的静态网页,把网页地址放在总结文档里。 + [我的静态网页地址](https://windblewsails.github.io/myFirst-repository/) ================================================ FILE: homework/lesson2/cloudyview.md ================================================ # 第二课作业 编程中为什么会有丰富化的数据格式? [静态页面链接](https://cloudyview.github.io/learning-javascript/) 这是一篇课程总结,所以首先回答老师提出的问题,编程中为什么会有丰富化的数据格式?我认为丰富化的数据格式主要是为了满足方便描述对象特征和方便计算机数据处理两方面。 ## 方便描述对象的特征 由于不同的对象有着不同的特征,所以数据格式会有多样化,丰富化的情况。以一个人为例,例如“小明”,针对这个人,我们需要描述一组非常复杂,相互之间无法直接替代的特征来对其进行描述。譬如身高,体重,年龄这些,就比较适合使用数字来描述。而性别,婚否这些,比较适合使用布尔值来描述,人生格言等比较适合采用字符串的方式,生日等比较适合采用日期格式等。还有一些离散型的特征,例如家属,需要利用数组类型来描述,而某些对象例如所属公司,或者项目,可能是一组属性的集合,将这组属性作为整体来描述。 根据所描述对象的不同,我们常常会用到组合型的数据格式,这些组合数据包含一组数据,这一组数据里同样可以有基本数据和组合数据。每种对象的特征,在不同的场合会有不同的抽象的方式方法和不同的视角,因此,也会导致数据格式的多样性。 对于这种复杂的情况,当然,我们也可以通过一大段文字来描述,将所有数据都放在一堆,让读的人自己去分析,去找。这样一来读起来是非常费劲的,而利用格式化和符号化的方式,则可以让人更加轻松的理解数据。 ## 方便计算机进行数据处理 编程所编写的程序,采用的是计算机语言,而程序本身的目标则是处理数据,得到结果。也就是说,我们的程序所处理的数据,必须是计算机读得懂,容易处理的数据。 如果说,人类可以读得懂自然语言的文字所描述的各种数据,那么计算机实际上普遍并没有这么智能。计算机能够处理的肯定是经过了格式化和符号化的数据。而针对不同数据类型,计算机显然有不同的处理方式。例如都是数字,计算机就可以对其采用数学运算符来进行操作,而对于字符串,当然也可以有字符串的处理方式,如果非要对字符串进行加减乘除,显然没太多意义。 还有一点就是关于数据的存储了。早期计算机的资源很有限,所以基本上要充分利用每一个字节的存储资源,因此,数据类型里对数字要区分为整型,浮点型之类,为了减少对内存的消耗。因此,有一部分数据格式的设计是为了对计算机资源进行更为有效的利用。 以上是我对于数据格式的理解。 下面是对于课程的学习总结 ## 命名 ### 一切从命名开始 这一课的开端是:“一切从命名开始”,从命名开始,我们得以操纵变量和数据。这句话太赞。 以前感觉程序员可以从零开始构造一个体系,这个体系能够达成某些功能,实现某些目标,感觉非常神奇。但是对于程序员到底是如何做到这一点,理解的并不深刻。 而这句话———— 一切从命名开始,打开了这个结。 命名是针对变量进行的(这个理解不知道是不是以偏概全了,请老师指正),而通过变量,我们可以进一步去连接数据。所以,通过命名,我们可以去操纵数据。有了数据,我们就可以通过编程的手段对数据进行处理,然后得到我们想要的结果。而这样,我们就可以构建一个自我完备的,自洽的体系。 命名是非常重要的,相当于一个抓手,如果抓手没有了,找不到了,或者不好用了,操作数据等等都无从谈起。 ### 驼峰大小写命名法 命名的书写方式,老师也给出了范例,实际上常见的有四种,即全部小写,下划线分割方式,单词首字母大写,第二个单词开始首字母大写,也就是:myname,my_name,MyName,myName。 老师今天提到了驼峰式命名,Camel Case,就是后两种命名书写方式。MyName这种叫做大驼峰方式,myName叫做小驼峰方式。 命名中间没有空格或者任何连接线,可以减少错误,而单词首字母大写,有利于加强可读性。 由于很多系统里面,实际上是不区分大小写字母的,所以,我推断,MyName和myName在计算机处理的时候,实际上是等价的,驼峰方式只是为了程序员阅读方便。 ### 对于命名方式的思考 命名既然如此重要,那么肯定要充分的思考其特点。对于计算机来说,命名神马的无所谓。我们将文件放上一个系统,例如放上淘宝的图片空间,淘宝系统就会自动给一个命名。这个文件命名完全不具备可读性。但是,对于淘宝系统来说,却是无所谓的,因为它只需要让这个名字不重复,不冲突就好。 所以,命名方式,主要帮助对程序员增加对编程工作本身的控制力的。人类是需要意义才能够理解和记忆事务的,如果记忆毫无意义的信息,人类的能力非常差。所以,命名本身必须具有容易为自己和将来可能看到程序的人理解的意义。 同时,还必须保证不会重复,不会有冲突。 从这些角度出发,我推论(没经验,只能推论): > - 变量的命名最好以英文单词来构成。拼音似乎不应成为推荐的用法 > - 命名所构成的英文单词与其所对应的属性、内容有较强的关联 > - 不同类型的变量,最好带有规则,例如针对Animal的属性,就用譬如AnimalHeight,AnimalWeight. ## 程序的目的 程序的目的:处理数据,得到结果。 乍一看,好像没说完吧,程序能够通信,玩游戏,做文档,管生产等等。但是,如果认真的思考一下,就会发现,其实程序只有两件事情:数据,算法。所以,针对数据,进行处理(用算法来处理数据),得到结果。 ## 变量的使用 变量的使用:声明变量,定义变量,赋值变量 定义变量的意思,我推断是要将变量究竟适合于何种数据格式要说清楚。也就是说,计算机底层的执行,是必须知道变量的类型的。而JS应该是在第一次赋值的时候,根据数据本身的类型对变量先做了一次定义,然后再使用的。 这里的问题是:究竟是第一次赋值的时候进行了定义,还是每次赋值都重新定义呢?一个变量在一个程序里可以随意改变自己的类型吗?如果是C的话,肯定是不可以。 ================================================ FILE: homework/lesson2/cuimiao.md ================================================ #第二课笔记 老师先教给我们如何创建静态页面,又教给我们如何正确的提问题,比如遇到问题应该折腾自己,然后是搜索,再去讨论区看是否有其他同学提问过,最后最后,才能在微信群里提问,而且提问是需要技巧的,必须把自己的环境,步骤等都描述清楚,才能提问,给解答者带来方便。 #正题: 其实老师真正要教给我们的是编程的思想! 一切以命名开始 用名字来代表一组数据的集合,是一堆属性+关系+其它特征的集合,而名字就相当于是这组数据的代号。 用符号化的方式或者伪代码的方式来描述一个名字,会让我们更直观的认识它。 程序的目的是什么?处理数据,给出结果。 数据,包括小明的属性,关系等一切数据。 数据、变量 变量的名称和数据是一一对应的,通过变量名称,来使用,调用具体的数据。 声明一个变量,并对这个变量进行定义,对其赋值 多样化的数据格式,是为了更方便的定义那些变量。 #实操 再次提醒编程的世界里只有英文,除了字符串可以有中文。 变量之间可以用逗号隔开,这样可以节约代码行数,提高运行效率。 对象里,定义一组数据用的是冒号而不是等号。 ================================================ FILE: homework/lesson2/dangfeipeng.md ================================================ ### 为什么要有丰富化的数据格式? 现实世界是由万事万物以及各种关系和逻辑组成,人类通过数万年的进化,已经形成了一套完整的数据格式来帮助我们记录、处理、展示这个丰富多彩的世界,比如用数字表达财富,用文字或者语言表达情感,以及用图片、影像记录下难忘的精彩场面等等。 程序的目的是“处理数据,得到结果”,而这其中的数据就来源于现实世界,并且要映射到计算机当中,如果程序只有一种数据格式是否可行呢?理论上来说当然可行,毕竟程序最终都会被转化为计算机能够处理的数据-0和1的组合,但是那样做效率太低下了,所以程序就设计出恰当完备的数据格式,方便程序员通过对数据格式的各种组合来完成信息从现实世界到计算机世界的映射,进而利用计算机进行高效的处理,比如用整型表达整数,用字符串表达文字,用布尔型表达真假对错,用数组表达集合,用对象表达组合信息,而对象中的各个属性又可以是不同的数据类型,概括来说丰富的数据格式就是帮助程序员在计算机世界中准确、高效地表达信息。 ================================================ FILE: homework/lesson2/dengxy0907.md ================================================ 编程中为什么会有丰富化的数据格式 ================= ### 1、我对编程的的看法 >如果事物都能数据化,那么通过编程就能定义数据,然后通过调用数据打成目的。 ### 2、数据类型 > 布尔型、数组、字符串、null、资源,目前我只记得这些,我会赶紧复习、学习以跟上进度。 >关于数据类型为什么有这么多,确实没想过为什么,但是细思起来,确实不同情景下使用适合的类型会方便很多,应该也有方便计算机执行的作用。 ### 3,静态网页 > [我的git网页](https://dengxy0907.github.io/text/) > 课程的话我目前只看过一遍,因为时间关系,为了打通流程,仅仅写了一个最简单的页面。 ================================================ FILE: homework/lesson2/diaozhicong.md ================================================ #第二次课总结: ##编程中为什么会有丰富化的数据格式? + 编程操作的对象是多种多样的,如名字、数值、属性、关系等。 + 数据格式有数值、字符串、布尔、null和undefined、对象、数组、函数等。 + 我们编程的目的是处理数据,得到结果。这个过程需要时间,而多样的数据格式可供选择与使用,可以缩短时间,节省大量内存,提高运算的效率。 + 丰富的数据格式因为拆分的细,所以使用很灵活。即使碰到复杂的数据格式,也可以用基础类型通过搭积木的方式组合出来。 + 多样的数据格式方便理解应用。多人协同工作的时候有标准可依、互相之间底层共识相同,大大提高协同工作效率。 ###个人静态网页 https://sam-tiao.github.io/diaozhicong/ ================================================ FILE: homework/lesson2/duhongxia.md ================================================ 杜红霞的第二课作业 程序的目的:“处理数据 得到结果。” 课中用小明的例子来进行了说明: 我们通过程序来描述小明,那么就要对小明的数据进行处理。小明的数据包括哪些呢:有他自有的 基本属性(身高、年龄、体重、性别等数字、文本)再加上他的社会关系(家庭关系、朋友关系、同学 关系,这些构成数组数组)。那么描述小明的的数据就包含了文本、数字、数组等数据格式。 编程中为什么会有丰富的数据化格式? 同样的我们通过编程还会描述其他的事物,相应的为了更准确、更方便的描述我们就会有丰富化的数据 格式。 网页地址: https://duhongxiaanna.github.io/dream/ ================================================ FILE: homework/lesson2/fangqingyang.md ================================================ ### JS入门第二课 #### 一切以命名开始 不命名的话,我们人,怎么操控那样一堆数据呢?输入了数据,计算机确实是有了数据,但是操纵不方便。就像我们和小明相处过,也确实在大脑里面存有小明的数据了,但如果没有小明这个名字,我们的大脑无法有意识的调出小明的数据,或者为了调用数据自动就换成“这个人”来代替“小明”。又比如,我们在说这是谁干的?别人说了一个名字,听到名字后,我们立刻能够在大脑里面调取出这个名字背后的数据(关系,属性),然后知道是谁干的,之后就有一系列动作。我们要找一个人,知道名字比知道外貌特征更方便,我们查资料,知道资料的名字比知道资料的某个特征更方便。一个名字背后代表着一个数据的集合。以“一”统多,是我们理性思考的能力,名字是“一”,背后的数据是“多”,否则我们将局限在一堆数据里面,局限在很小的范围里面,无法解决问题。写程序的目的是处理数据,得到结果,命名后,将名字与一堆数据挂钩(变量先声明后定义),我们就可以更好的操纵数据,也就可以处理数据了。 #### 数据格式怎么理解?为什么要有那么多的数据格式? 不同的数据格式能够让我们更好的根据我们需要解决的问题来描述数据,背后对应着不同的处理数据的方法,使我们能最简单最有效的处理数据。假设有多箱苹果,如果我们仅仅需要知道有多少苹果?那么把一箱苹果与一个数字对应会比把这箱苹果与一个字符串对应,来的方便。数字我们就可以让我们自由的使用加减法,然后得到我们想要的结果。随着问题的不同我们可以采用不同的数据格式,如果我们不仅需要知道有多少苹果,还需要知道苹果的种类,还需要。。。 多种数据格式是为了让我们更好的处理数据,得到结果。 ================================================ FILE: homework/lesson2/fanqing.md ================================================ * [课程回顾](#1) * [理论讲解](#1.1) * [实操部分](#1.2) * [心法记录](#1.3) * [课程作业](#2) * [作业-1](#2.1) * [作业-2](#2.2) * [作业-3](#2.3) * [附加作业](#2.4) * [其他学习](#3)

课程回顾

### 番外篇: gitthub静态网页搭建方法。

* 理论讲解

在信息技术高速发展的现在,我们可以这样理解,对人类来说的所有的信息都是对计算机来说的数据,因此可以想象,计算机可以涵盖的数据的多样化、丰富化。 ### 一切从命名开始 #### 以人名举例讲解:我们对于一个人的概念,可以说是一堆属性和关系的集合。包括:姓名、身高、体重、年龄…… 先取名再生小孩——把名字和小孩关联上。 用名字来操纵人——小明,快去写作业。 从姓名开始思考——丰富的属性、多样关系。 名字和目标——小明是一个具体的人,目标是一堆属性、关系等。 关联名字和目标——小明不等于一个具体的人,“小明”这个名字,只是一组数据的集合。 #### 各种描述递进:用格式化方式、符号化方式、伪代码方式描述“小明”,越来越接近代码的呈现。——能看懂伪代码了就能看懂代码了 我们是如何识别人的?——记住一个人的名字与其属性、关系的对应信息。 #### 程序的目标地是什么?——“处理数据、得到结果” 首先需要对数据进行命名(一切从命名开始): 与C、Java等其他编程语言不同,JavaScript 里所有数据,不区分类型,都用“var”表示 语句:var output = “Hello, JS” 代表:1..声明:var output;2.定义:output = “Hello, JS” 即:声明这个变量,变量名output,再定义这个变量,给这个变量赋值。 #### 内行话——“先声明再定义” 命名方式:常用驼峰命名法,(还有带下划线的,具体内容自己了解) 学习补充:变量常用小驼峰法,类名、空间名等常用大驼峰法。

* 实操部分

分别在浏览器和Node环境运行样例,尝试修改内容,观察显示效果,对运行环境有初步感受。

* 心法记录

1、本课程重点是编程思想的讲解 2、代码不重要,掌握理解问题、解决问题的方法最重要。 3、一切从命名开始——体会:对于一个新的要表达、运用的信息或数据,名字起得好一定程度上代表思路、概念清晰。 4、学会、擅用画图的方法来进行思考。

课程作业

>【第二次作业】变量和值 >昨天我帮你们梳理了变量和值之间的关系。下面梳理一些知识点供大家参考,好好利用周末的时间把这块啃下来。 >1. 多样化的数据格式(数字、文本、布尔、对象、数组) >2. 多样化的数据格式的操作方式。 >以上内容网上有很多教程,如果你想买书,我推荐“JavaScript权威指南—淘宝前端团队翻译的那本”

作业要求-1

>熟读getting-started-with-javascript/study/lesson2/smaple_code.js代码。用node环境和浏览器环境运行一下代码(注意:浏览器运行请使用my_personal_info_page.html) #### Node运行环境截图: ![Node-1](https://ws4.sinaimg.cn/large/006tNc79ly1fis4n6t7qbj31kw0vk7la.jpg) #### 浏览器运行环境截图: ![browser](https://ws4.sinaimg.cn/large/006tNc79ly1fis93nnv7cj31kw0xcqg9.jpg)

作业要求-2

>写一篇课程总结,题目为:编程中为什么会有丰富化的数据格式? 在信息化社会,数据几乎无所不包,所有可以想象到的信息都可以用数据来记录、存储。在快速更替的时代,我们希望有更高效、高质的工作、学习以及生活,丰富多样的实用软件、精准高效的数据分析处理工具都再发挥着越来越重要的作用。 如此纷繁的数据交给计算机来处理,需要有规范的数据格式,即数据类型,以便处理能力更有的放矢、更高效。 #### (一)数据大类 在JavaScript中数据类型分为两类:1.原始类型、2.对象类型。 原始类型:包括数字、字符串、布尔值。 有两个特殊的原始值:null(空)、undefined(未定义)。 对象类型:对象(object),数组(array)是一种特殊对象,函数是另一种特殊对象。 #### (二)具体说说: ##### 1.原始类型: 1-1.数字: 1-1-1. JavaScript的数字均采用IEEE 754标准定义的64位浮点格式表示,不区分整数值和浮点数值(与C和Java等不同),需要注意的是:JavaScript的实际操作,整数是基于32位整数。 1-1-2. JS程序中直接出现的数字称为数字直接量(numeric literal),包括整型直接量、浮点型直接量。 1-1-2-1. 整型直接量:包括十进制整型直接量、十六进制整型直接量。某些JS的实现支持八进制整型直接量,但不保证通用,因此一般不要使用八进制整型直接量。 1-1-2-2. 浮点型直接量:包括传统实数写法,例如:3.14、1.789;指数记数法,例如:6.02e23、2.987653E-32。浮点型直接量语法表示为:[digits][.digits][(E|e)[(+|-)]digits] 1-1-3. JS的算术运算: 1-1-3-1. 基本运算符包括加(+)、减(-)、乘(*)、除(/)和求余(%) 1-1-3-2. 复杂的算术运算:通过Math对象的属性定义的函数和常量来实现,例如:Math.pow(2,3) ->8,2的3次幂;Math.ceil(.6)->1,向上求整;Math.floor(.6) ->0,向下求整。 1-1-4. JS的算术运算在溢出(overflow)、下溢(underflow)或被零整除时不会报错。 1-1-4-1. 溢出(overflow):即当数字运算结果超过了JS所能表示的数字上限,正数时以无穷大(Infinity)表示、负数时以负无穷大(-Infinity)表示。 1-1-4-2. 下溢(underflow):即当运算结果无限接近于零并比JS能表示的最小值还小,此时JS会返回0。还有个“负零”概念,一般可忽略。 1-1-4-3. 被0整除,返回无穷大(Infinity)或负无穷大(-Infinity),0除以0、无穷大除以无穷大、给负数作开方或算术运算符与不是数字或无法转换为数字的操作数一起使用时,都将返回非数字,表示为NaN(not-a-number)。 NaN有一点特殊:它和任何值都不相等,包括自身。x==NaN不能表示x是NaN,可通过x!=x判断,当且仅当x为NaN时,x!=x为true。 1-1-5. 二进制浮点数和四舍五入错误 在JS的数值范围内,浮点数只能表示有限个数实数,而不是一般理解的无数个,会有些真实值只能近似表示。这是由于浮点数表示法是二进制表示法引起,只能精确的表示2的次方分之一的值,如:1/8、1/1024,而我们常会使用十进制分数,如:1/10、1/1000,二进制浮点数无法精确表示类似0.1这样简单的数字。会造成运算的尴尬,如0.3-0.2并不等于0.2-0.1。 这不是JS中才会出现,好在精确值非常精确,一般任务都能胜任,只有在比较两个数大小事才会遇到。以后的版本或许会针对此做改进。如涉及重要金融计算,建议使用“分”而不是“元”作单位。 1-1-6. 日期和时间的表示:JS语言包括Date()构造函数,可以创建包括年月日时分秒的对象,进行日期、时间的特定值提取、使用,有些特殊规范,比如月份从0开始。 1-2. 字符串: 1-3. 布尔值:boolean,指代真或假、开或关、是或否,类型值只有两个:true和false。用于编程语言的控制结构。通常与比较语句结合使用,举例: If(a==4) b=b+1; else a=a+1; 这段代码判断a是否等于4,等于时,b加1;不等于时,a加1。 关于转换:任意JavaScript的值都可以转换为布尔值,其中undefined、null、0、-0、NaN、“”(空字符)六个会转换为false(有称“假值”(falsy value)),其他值均会转换为true(有称“真值”(truthy value))。 布尔值支持三个布尔运算符、一个方法:”&&”(AND)、”||”(OR)、”!”(NOT) 以及toString() ##### 2.两个特殊的原始值:null(空)、undefined(未定义)。它们不是数字、字符串、布尔值这些原始类型,通常代表了各自特殊类型的唯一的成员。它们都不包含任何属性和方法。 ##### 3. 对象类型:对象(object),数组(array)是一种特殊对象,函数是另一种特殊对象 3-1.对象(object):(还需学习理解、补充) 3-2.数组(array):是值的有序集合。每个值叫做一个元素,每个元素在数组中有一个位置索引数。数组元素可以是任意类型,也不一定是常量。数组能够表达不同类型的组合信息,比如一个人的相关信息等。 3-2-1.创建数组: (1)数组直接量: 没有元素的数组:var empty=[]; 有3个元素的数组:var array1=[1,2,3]; 3个不同类型的元素和结尾的逗号:var array2=[1,“a”,true,](数组直接量语法允许有可选的结尾的逗号,所以是三个元素而非四个) (2)调用构造函数Array(): 没有任何元素的空数组:var a = new Array() 指定长度作为参数:var a = new Array(10)——没有存储值及索引,预分配了一个数组空间。 显式指定方式:var a = new Array(5,4,3,“test”);——这种方式不如使用数组直接量。 3-2-2.数组方法包括:join()、reverse()、sort()、concat()、slice()、splice()、push()和pop()、unshift()和shift()、toString()和toLocaleString(),前面这些是ECMAScript3中的方法,在ECMAScript5中还有forEach()、map()、filter()、every()和some()、reduce()和reduceRight()、indexOf()和lastIndexOf() (还需在使用中逐渐深入理解)

作业要求-3

>如果有问题,在总结中把你的问题罗列出来,我会做解答。 ### 遇到的问题 #### 1、 浏览器运行代码发现的情况: ##### 当打开my_personal_info_page.html页面后,同一部分内容,并未修改这部分代码,刷新前后显示效果不同。 ![刷新前](https://raw.githubusercontent.com/fanmilir/GithubPic/master/Touching_JavaScript/Lesson2-Q-Chorme-FirstScreen.jpeg) ##### 修改代码后直接点击浏览器的刷新后“console”页显示:(后来试过不做任何代码修改,直接刷新也会这样) ![刷新后](https://raw.githubusercontent.com/fanmilir/GithubPic/master/Touching_JavaScript/Lesson2-Q-Chorme-UnshutConsoleFreshScreen.jpeg) #### 想知道这是什么情况? #### 2、更新Fork项目时报错: 需要更新老师的项目内容,从网上搜索到方法介绍(原文链接地址:http://blog.csdn.net/qq1332479771/article/details/56087333),文中介绍了网站和终端两种方法。 先使用的终端方法,结果失败了,最后一步提示报错,后来使用了网站操作方式很顺利,更新成功。 ##### 终端报错如下图,请老师帮忙分析下网站能成功、终端不成功是什么原因?谢谢~! ![报错图](https://raw.githubusercontent.com/fanmilir/GithubPic/master/Touching_JavaScript/Lesson2-Q-UpdatePrFromTerminalError.jpeg) #### 3.关于Date()函数,尝试执行 var now = new Date(),得到的返回值时间是晚于我们8小时的时间? ![time-check](https://ws2.sinaimg.cn/large/006tNc79ly1fis7e86kjqj30mm07nwh6.jpg) #### 4.另外想问,能不能推荐个MAC用的保存网页(好几屏)为图片的好办法?用chrome能不能实现?

附加作业

>1. 在github上部署自己的静态网页,把网页地址放在总结文档里。 在github上部署的静态网页:https://fanmilir.github.io/MyPage/ >【作业提交方式】 >1. 请向getting-started-with-javascript项目发起pull request。https://github.com/xugy0926/getting-started-with-javascript >2. 文档格式,markdown。 >3. 提交homework/lesson2目录下。

其他学习

#### 学习使用MarkDown实现页内跳转 因为把课程学习内容都作为作业记录了下来,不知的作业是其中一部分,按顺序放在了后面,想实现页内跳转,方便查看。于是搜索,参考网页:http://www.cnblogs.com/JohnTsai/p/4027229.html ---- #### 禅定一刻 独立的人会感恩。因为对别人没有过多的苛求,所以获得帮助的时候常常感恩。因为感恩,也对其他人公平,所以公平也成了一个自然的性格特点。独立的人做事情的时候知道自己不会得到太多别人的帮助,所以也很少抱怨。没有达成目标的时候会持续地努力。独立的人很少会有情绪,所以也非常理性。——万维钢。 ================================================ FILE: homework/lesson2/fengkai.md ================================================ 为什么会有丰富化的数据格式: 对于不同场景下的变量或者是数据,能够将彼此相互关联起来,最终分解成机器能够理解的二进制0和1 1. 数据格式: str 字符串 int 整型 float 浮点型 list 列表 array 数组 boolean 布尔型 object 对象数据 对象变量 组合形的数据 2. 变量 声明变量 定义(内存) 赋值 3. 变量编程的逻辑 顺序 分支(选择) 循环 个人主页: https://fengkaiwater.github.io/myPage/ 纯属个人理解 ================================================ FILE: homework/lesson2/guowei.md ================================================ # 小白JS入门不放弃 lesson2 ### Focus question: *编程中为什么会有丰富化的数据格式?* *** 编程中为什么会有丰富化的数据格式,想回答这个问题,先从**数据类型**这个概念开始剖析。 ### 编程中的数据类型 在编程世界里,能够表示并操作的值的类型称作数据类型。而编程语言最基本的特性就是能够支持多种数据类型。 在JS中,数据类型分为两类:**原始类型和对象类型。** **原始类型**包括: + 数字 + 字符串 + 布尔值 + null(空) + undefined(未定义) **对象类型**包括: + “命名值”的无序集合 + 数组 + 函数 *** ### 什么是数据格式? 百度百科这么定义: > 数据格式(data format)是数据保存在文件或记录中的编排格式。可为数值、字符或二进制数等形式。由数据类型及数据长度来描述。 *** ### 为什么有如此丰富的数据格式? 数据格式的确定应该满足如下条件: +保证记录所需要的全部信息; +提高存贮效率,保证存贮空间的充分利用; + 格式标准化,保证有关数据处理系统间数据的交换。 **一言以蔽之:为了让我们能更有效率地记录和使用数据。** *** ### 该如何使用如此丰富的数据类型? 回归第一堂课的总结: + 学习学习再学习:熟悉每一种数据类型和对应的格式; + 使用使用再使用:在使用JS解决问题的过程中,熟练掌握. *** ## **第二课总结** ### 什么是程序 > **处理数据,得到结果。** ### 一切以命名开始 在JS中,对于变量的使用: > 1.声明:声明要创建一个变量。 > 2.定义:给这个变量开辟一块内容。 > 3.赋值:最后才是赋值。 *** ### 个人网站:https://wei02320.github.io/My-private-website/ ================================================ FILE: homework/lesson2/hanmeng.md ================================================ #这是我的静态网页地址https://menhan.github.io/my_test/ 目前只修改了链接地址,颜色。 #第二节课总结 ##编程中为什么会有丰富化的数据格式? *** 我的理解,编程就是调用不同的指令,处理数据,最终得到想要的结果。 在调用指令处理数据之前,要先找到数据,并且要给这些数据起个名字,方便调用。如果只是找到一堆数据,不进行命名,不能被调用,是没有意义的。 *** 找到很多数据以后,我们就按照程序语言的要求对数据进行分类,根据数据不的使用要去,定义成不同的格式。 ================================================ FILE: homework/lesson2/hanwei.md ================================================ ### 编程中为什么会有丰富化的数据格式? 在现实生活中,为了有效的交流我们要给事物一个名字,这样才能通过简洁的语言指向我们要表达的事物。这一点在程序中也是一样的,文件名、变量名、函数名、参数名。如果不使用名字,我们就很难快速的指向一个事物,进而每次要对这个事物进行呼唤、传播、操作的时候都会麻烦很多。而且,即便是没有给一个事物起名字,那些用来描述的它属性本身也是名字,如果一个名字都不使用我们就无法表达,更无法沟通了。 人的名字就是一个例子,比起说黑头发、180高、小眼睛、大鼻子来表述一个人,我们使用名字会更有效率。这样在沟通的过程中也会更有针对性,在计算机的世界里,命名更加有意义,因为比起使用内存地址,代码位置,机器语言通过名称调用更加快捷高效,而且在一个名称里面集成其他名称的函数、变量、方法越多,它越高效。 然而,名字虽然指向事物,但它并不等于事物。就拿人来说,人是一个非常具体的事物,如前面所说可能有黑头发、180高、小眼睛、大鼻子等等特性,这都是“人”这个事物实实在在的特质,是它们才将“人”同其他事物、其他人区分开来。而名字,仅仅是一个代号。它代表这个个体,但是并不等价于它。这在程序里也是一样的,一个变量名、函数名,它们只是指向了一个值、一段代码,具体的值和代码才是我们真正需要的东西。 所以,名字一定要和具体目标的特性相挂钩,这样才能明确指代关系。如人名,那么就要和这个人的长相、身高、国籍等等特性匹配起来,匹配的属性越多,他们的关联性也就越强。需要注意的是,一个人可以有几个名字,但是在实际使用名字的时候,一个名字只能是指定具体的一个人。在程序里,这个道理是一样的。一个值或者功能代码可以被不同的变量名或者函数名指向。但变量名、函数名在使用时只能指向一个具体的值或者功能代码。这样才能保证我们正确的使用函数和功能代码。 具体事物的特质,有他们自身的属性和他们与其他事物的关系。他们和事物的名称一起组成了关于该客观事物的完整数据。有了这些数据,我们才可以准确的指代和描述一个客观事物。在具体描述这些数据的时候我们可以有多种方式,语音的、文字描述的、图形图画还有通过编程语言来描述,不同的编程语言之间会有一些语句、语法、命名、定义规则等方面的不同,但所有的编程语言又都有一些相同的描述规则。 数据存储在计算机里面有两个特点,一个是要被使用,另一个是要占存储空间。针对这两点,自然而然就需要对不同的数据采用不同的存储方式。具体的就是为不同的数据使用不同的数据格式和对应的存储空间。使用不同的数据格式,就可以为不同类型的数据使用专门的数据处理方法,比如数值类型的数学运算、字符串类型的符号处理等等。同时,由于为不同的数据类型使用不同的数据格式,可以在很大程度上避免内存空间的浪费或者存储数据的丢失,这不但能节省本地的计算机资源,还能更有效的利用网络传输的带宽。 在js里常用的数据格式有数值、文本、字符串、数组、布尔、对象这些,其中除了数组根据数据个数相应变化空间占用的大小还有对象根据组成数据的个数和类型变化空间占用大小外,其他类型的数据占用的空间大小是固定。 为了做到这些,大部分的编程语言有一些相同的步骤。一般有三个步骤。第一个步骤,声明变量。这是给变量起名的过程,相当于告诉程序我准备要使用一个新的变量来存储数据,给这个变量起名XXX。第二步就是定义变量,这相当于告诉程序这个数据是什么类型,用什么数据格式,给他安排相对应的存储空间。第三步,则是为变量赋值,就是将具体的数据存到这个变量所指定的存储空间里。 这些步骤是在具体使用代码时完成的,对js来说,就是在node.js或者浏览器环境下执行代码完成的。在node.js环境下我们可以直接在终端里看到代码,但是在浏览器下我们只能去console后台看,这是他们不一样的地方。其他的执行代码的部分这是一样的,一样的数据类型和格式、一样的空间分配规则、一样的命名方式。 #### 静态网页地址 https://freedomsky11.github.io/library/ ================================================ FILE: homework/lesson2/haohu.md ================================================ #编程中为什么会有丰富化的数据格式? - 与现实世界对应: 不一样的东西就有不一样的描述方式,增加程序可读性 - 提高空间利用率: 不同的数据格式占用的空间不同,可根据实际需要分配 - 提高程序的性能: 不同的数据格式适用于不同的需求,使用合适的数据结构能大大增加程序性能 #部署自己的静态网页 - [郝户的静态网页](https://venivediveci.github.io/) ================================================ FILE: homework/lesson2/hewei.md ================================================ # 第二节课笔记 ## 视频讲座 ### 一切以命名开始 为什么要命名?就是为了方便开发者编写代码。 代码不只是让机器运行的,更是让人看的。现在的电脑性能已经让一般的开发者将重心放到实现功能上,而不是解决资源上。所以,书写易读易懂的代码,是非常重要的。 和学会编程的语法相比,学会编程的思想要远远重要得多! 学会了思想,就可以一法通万法通,玩熟了JS,Python也能迅速上手,C#也没问题。这凭的是什么?就是对表面的编程语法背后本质思想的真正理解。 语法只是术,背后的思想则是道。语法各有不同,道则大同小异,甚至可以说是基本相同的。 而所有的编程思想,都是从命名开始的。 人类之间是需要沟通的,不管是语言还是文字,我们在说世界上的万事万物时,都是用名字来指代的。即使是**道可道,非常道**,也是用**道**来指代这个玄妙的概念的。 在程序世界里,自然也少不了名字。用户注册,要输入用户名,要输入密码,如果不用名字来指代用户输入的各种信息,怎么能够使用它们呢? 在现实世界中,我们用一个名字来指代一个具体的人。 在程序世界中,我们用名字来指代内存中的一段数据。 ### 如何识别不同的人? 小明,指的是一个具体的人。 但我们能不能说,一个具体的人,就等于小明呢? 这是不能的。我们头脑中的每个具体的人的概念,是根据这个人的各种特征来确定的。 而名字只是一个代号,是用来指代一个人的身上的各种特征的,但是不等于这个人。 也就是说: ```text 小明 = 一个人的一堆属性+关系+各种其它特征(这些特征的整体称为集合) ``` 而每个不同的人,我们就是用他们各自独特的属性+关系+其它特征来识别的,然后再加上一个指代的称号,就是人的名字、昵称或者外号。 ### 规范化描述方式 用格式化的方式,描述这个人的各种特征,就可以让我们对这个人的特征一目了然。 而进一步改进,用符号化的方式来描述,这种格式其实就和编程语言里的格式差不多了。 ### 程序的目的是什么? > 处理数据,给出结果。 所有的程序,做的都是这些事情。读入数据,进行处理,然后给出结果。 明白了这个基本的道理,在解决问题的时候,就应当贯彻基本的思想,选用合适的方法,尽量高效地完成自己的工作。 ### 数据和变量 名字、名称和具体的数据对应才有意义。 代码中的变量名也是如此,变量的名称是和具体的数据一一对应的,通过变量名称,来使用、修改具体的数据。 什么是编程思想?就是要根据不同的需求,选用合适的数据类型来表征各种各样的事物。 ### 声明、定义及赋值 `var output;`语句只是声明了一个`output`变量。 `output = "Hello, JS";`则是定义output变量后并进行赋值。 ### 最终回:为什么要有各种数据格式? 我们人类写程序,都是为了解决各种各样的问题。程序是一种工具,来帮助我们更好地做事情。 男人喜欢各种五金工具,在做机械方面的工作时,合适的工具会很顺手。 女生的化妆品则是丰富多彩,唇膏、唇彩、唇蜜、唇釉各展所能。 而在程序的世界中,我们也需要各种可以合理指代现实或者虚拟事物的东西! 这个时候,数据格式就派上用场了。我要计算理财收入,那么就必须有数字;我要展示文章中的一句话,那么就需要字符串;要知道某个人今天是否来上班了,就要用布尔型变量;要列出家中的家具清单,就要用到数组;要记录一台电脑的配置和功能,就要用到对象了! 所有的这一些数据格式,都是为我们能够更方便地写程序来服务的。假设没有数组、没有对象,要列出电脑里的配件,就只能一个一个的列出来。要列出几十种不同型号电脑的配件呢?那就是个很可怕的工作了。但是有了数组、有了对象,每种型号的电脑都是一个对象,每个对象内部又有数组来指代各个电脑配件,这样清楚明白的结构,使用起来不是方便很多? 这还只是最基础的编程思想,要深入领悟这种思想,知其然并之气所以然,这样即使要学新的编程语言,也一样能迅速上手。如果把这个思想应用得更广泛一些的话,生活中的许多方面都是可以应用编程思想的,就像笑来老师那样。 所以说,举一反三非常重要! ## 建立自己的第一个个人主页 ### 出现问题:Site not found 完全按照教程来操作,但是打开页面[https://dream4ever.github.io/test/](https://dream4ever.github.io/test/)时,显示的并不是所期望的网页内容,而是Github的提示页面: ```html 404 There isn't a GitHub Pages site here. ``` ### 加餐:如何提出一个好问题? 以这次遇到的问题为例:Github Pages无法访问,我该如何求助? ```text 1. 基本环境: 操作系统:Windows 10 64位版本 浏览器:Chrome 60(常用浏览器的最新版,排除浏览器导致的故障) 网络状况:可正常访问Github,并可通过终端同步代码(说明不会是网络导致的故障) 2. 已做步骤: - 将徐老师getting-started-with-javascript这个项目的最新版本同步至自己的项目。 - 在Github上新建了一个项目test并通过git clone到本地。 - 将徐老师getting-started-with-javascript/study/lesson2/github_index/目录下的所有文件,都复制到了test目录下。 - 在Github上的test项目的设置中,Github Pages这里的Source选项,选中了master branch,并进行了保存。 - 保存之后,Github也给出了提示:Your site is published at https://dream4ever.github.io/test/。 3. 存在问题: 访问https://dream4ever.github.io/test/,Github提示"404 There isn't a GitHub Pages site here." 4. 思考原因: 想起来自己以前也配置过Github Pages,当时就有人说过,这个配置要延迟几分钟才能生效。可能这次也是这个原因。 ``` 因为这次是自行解决了问题,所以给出自己的解决方案: ```text 5. 解决方案: 自己就把这件事情暂时放下,忙别的事情去了。过了一会儿再打开https://dream4ever.github.io/test/,果然可以正常访问了,完美! ``` ================================================ FILE: homework/lesson2/huangjiashu.md ================================================ 我知道,作业要从新做了,的确是没用心。实在是有付老师的期望。不过话说回来了,学习任何时候都是为自己学的。老师希望看到学生的努力和认真,很感谢老师对我第一次作业的肯定。言归正传: ## 提起命名 命名在程序中的确是不起眼又很重要的东西,好的命名让你可以不用看注释就知道表达的什么意思,糟糕的命名让人不知所云,不仔细看都不知道写的是啥,甚至有些命名需要靠猜才可以知道是什么意思。这就是名字起得不好。 一个好的命名是什么样的呢?就像老师讲的那样,把握两个原则: 1. 含义清晰 对比以下命名就能看出优劣 > var i,j,k var index > var xiaoming var personObj > var start var startTime > var time var endTime > var file var mdFilePath > var up var upCount > var down var downCount > var id var nameId 2. 要what不要how 命名直接指出是什么,而不要让思考是什么,怎么来的 对比以下命名就能看出优劣 > var inputData var employeeData 那么如何做到清晰的命名的,就要多思考你的命名是要表达什么,一般来讲都是需要用英文来表述的,因此不懂的一定要勤查字典,我说的查字大多指的是直接在网上查词翻译,比如[谷歌翻译](https://translate.google.cn/?um=1&ie=UTF-8&hl=zh-CN&client=tw-ob#en/zh-CN/)。而那些命名方式如驼峰命名,匈牙利命名规则等,目的就是对每个单词有个明显的界线例如首字母大写,例如单词间以下划线分隔等。这些都只是命名工具,最为关键的还是选词。 命名的意义在于操作它和使用它,如果定义了变量却没有使用它,那么它是没有意义的。说到定义变量,不得不提到一点老师所说的: > 声明:是在声明要创建一个变量 > > 定义:是给这个变量开辟一块内 > > 最后才是赋值 在向老师提问的时候,问过一个问题**为什么JavaScript是动态类型**老师举了个例子: ``` var xiaoming = '小明'; xiaoming = 1; xiaoming = ['a','b','c']; ``` 那么关于声明和定义来讲可以这么理解: 声明了1次:即声明了一个名为xiaoming的变量 定义了3次: 即每次赋值时都为此变量开辟了一块内存 赋值了3词:这个很好理解,有三个赋值语句。 ​ ## 数据类型 如果要说为什么有这么多丰富的数据类型,那么必然的要去了解这些数据类型有什么不同点。知道其特点及其用途自然就知道了为什么。关于此,我在网上搜索到了一篇[资料](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures)。以下内容大部分源于此: JavaScript数据类型:ECMAScript 6 定义了7中数据类型 - 6种原始类型 - Number 数字类型 除了能表示浮点数外还有一些带符号的值,+Infinity,-Infinity和NaN(非数值),**它并没有为整数给出一种特定的类型** - String 字符串类型 用来表示字符串,字符串是不可变的。但是可以基于原始字符串创建新的字符串 - Boolean 布尔值 表示一个逻辑实体,有两个值 true 和false 以区分真假 - Null 只有一个值null 目前常用于表示"没有对象",即此处不应该有值参见[null和undefined的区别](http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html) - Undefined 一个没有被赋值的变量会有一个默认值undefined,表示缺少值,就是此处应该有一个值,但是还有没有定义。 > (1)变量被声明了,但没有赋值时,就等于undefined。 > > (2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。 > > (3)对象没有赋值的属性,该属性的值为undefined。 > > (4)函数没有返回值时,默认返回undefined。 - Symbol (ECMAScript 6 新定义)符号类型是唯一的并且是不可修改的, 并且也可以用来作为Object的key - 和Object 对象是指内存中的可以被 [标识符](https://developer.mozilla.org/en-US/docs/Glossary/Identifier)引用的一块区域. 在 Javascript 里,对象可以被看作是一组属性的集合。 > 用[对象字面量语法](https://developer.mozilla.org/en/JavaScript/Guide/Values,_variables,_and_literals#Object_literals)来定义一个对象时,会自动初始化一组属性。(也就是说,你定义一个var a = "Hello",那么a本身就会有a.substring这个方法,以及a.length这个属性,以及其它;如果你定义了一个对象,var a = {},那么a就会自动有a.hasOwnProperty及a.constructor等属性和方法。)而后,这些属性还可以被增减。属性的值可以是任意类型,包括具有复杂数据结构的对象。属性使用键来标识,它的键值可以是一个字符串或者符号值(Symbol)。 > > ECMAScript定义的对象中有两种属性:数据属性和访问器属性。解释的太深了,我就不赘述了。 “标准的”对象和函数: “标准的对象”就是键和值之间的映射。键是不可变的 字符串或者symbol 值可以是任意类型。 函数是一个附带可被调用功能的常规对象。 JavaScript有很多内建对象,比如 Date对象,有序集比如 数组是是一种使用整数作为键(integer-key-ed)属性和长度(length)属性之间关联的常规对象。 **这一点w3cschool中对数据类型的解释不太一样,w3cscholl把数组也作为了JavaScript的数据类型** 但是使用typeof 查看时返回的是object 所以还是把数组理解为对象。 可以使用typeof 查看数据类型 ​ ### 如何搭建个人主页 1. 在github创建一个项目 2. 在项目的设置中找到 GitHub Pages 将此项目的master分支设置为页面来源 3. 在项目创建index.html文件 会自动成为githhub寻找的网页 因为上面的东西github都已经给做了,所以个人搭建主页的关键就是编辑网页。 我目前还没想好做个什么样的个人主页,所以借老师的主页用几天,希望不要介意。我的主页地址是: ​ ​ ​ ​ ================================================ FILE: homework/lesson2/huangqi.md ================================================ ##编程中为什么会有丰富化的数据格式 ###编程中为什么会有丰富化的数据格式?我个人的理解是这个样子的:“精心选择的数据结构可以带来更高的运行或者储存效率,还有方便代码的调用吧”,我这个样子理解不知道对不对。请老师指正。 ###我个人主页的地址 ###https://yearnds.github.io/pande/. ================================================ FILE: homework/lesson2/huangzhihua.md ================================================ # 第二课总结 编程中为什么会有丰富化的数据格式? 编程中为什么会有丰富化的数据格式? 编程本质上是人类与计算机之间沟通的桥梁,计算机是0与1的世界,如果编程的过程之中,没有制定一些“规则”,那么计算机每次进行“解析”的时间一定会非常长,并且当人们在编写代码的时候也会增加大量重复低效的劳动。 而描述一个事物,所需要的数据非常复杂,为了让数据进行“有机的统一”,那么把数据划分类型,就可以极大的降低用数据描述一个事物的难度,就好比把一个“人”的数据进行拆分统计,比如说:“身高、年龄、性别、体重、姓名、家属关系……等等”。 ### 以下这段“数据类型分类”我是从何伟的作业里复制过来的。我意识到没有跟上作业是一件非常吃亏的事情。 --- >在JS中,数据类型分为两类:**原始类型和对象类型。** >**原始类型**包括: >+ 数字 >+ 字符串 >+ 布尔值 >+ null(空) >+ undefined(未定义) >**对象类型**包括: >+ “命名值”的无序集合 >+ 数组 >+ 函数 --- ## 从第一节课到第二课遇到的坑,总结。 + 从第一节课我就发现了,高阳老师的作业喜欢埋很多“坑”,但这种坑不全是故意的——比如说用md格式提交作业,但是第一节课的时间我错过了,完全不知道大家是如何写md格式的文档的,但我还是做了md格式的作业,原因是因为python课程里有教…… 但我用的是Jupyter写的文档,提交作业没有什么问题,当时没有仔细想这件事,直到后来装了VS(visual studio code) // 打开了同学的作业,发现他们的格式和我完全不一样,有些同学的代码里一堆+、*…… ,关于这一点我意识到,虽然高阳老师的底线已经非常低了,但仍然还有更低的……发展空间。因为我在作业、ppt、js文档里,找不到相关信息,仿佛大家都知道怎么做一样,但是因为我对这部分知识是空白的,所以通过独立搜索需要花费更多的时间。 - 我搜了好几种方式的关键词,没有得到答案,最终我是看了markdown的语法说明才找到了问题所在,那就是“+、-、*”是一种无序的列表标记。就像我现在中每一段之前加的符号一样。 * 而关于同学们是如何写md的,我想到了简书或者是某一个软件,就像我做的一样,也可能有些同学用的是VS,但我找不到在VS里面直接输出md格式的方法。 # 个人静态主页: * https://puppet163.github.io/PRESSONE/ ```python ``` ```python ``` ================================================ FILE: homework/lesson2/huyong.md ================================================ #作业一 :编程中为什么会有丰富的数据格式 数据格式我的理解是就像英文里面的26个字母,这些字母排列组合沟通了我们要表达的单词,语句,想法; 丰富的数据格式对应着更多的字母,如果只有3个字母,按照排列着它并不能构成太多的单词,更没有了丰富的思想表达 对于数据格式同样如此,如果格式不丰富就无法完成程序员对于目标的实现,我猜不同的变成语言应该会有不同的数据格式, 否则不同的代码在nd环境和浏览器环境怎么会有不同的结果呢,当然格式就对应着解析,同样的格式对于不同的解析器, 可能会有不同的输出结果,而不同的代码对于不同的解析器可能会有同样的输出结果,这可能也就是不同的实现可以通过 完全不同的语言和环境来实现的原因吧,我是小白,继续学习吧。 #作业二:对于代码在两种环境中的执行,我今天从上午是十点半开始捣鼓md完成第一次作业,结果弄得我差点 学习边编程的信心,就是搞不好,我就转而去安装那两个程序,然后问了下群里面,真是一点我就通了,我把代码在 两种环境中都敲门一部分通过敲代码我发现,我输入的速度实在是太慢了,我记得有一种键盘操作方式能够很快的敲出代码, 这个我需要找下,同时对于var我的理解是定义,console.log是输出,然后那些间隔啊,标点啊,真的很考验你的输入能力, 所以肯定有一种适合程序员的敲代码的习惯或者是输入法。 #作业三:静态网页网址:https://huyong007.github.io/LhyOwjVhistoryE/ ================================================ FILE: homework/lesson2/jianglin.md ================================================ ### 姜琳第二次课总结 #### 课程总结:编程中为什么会有丰富化的数据格式 #####多样化的数据格式用于不同的情况和操作 - 数字:用于计算; - 文本:(字符串)用于表示是什么; - 布尔:是/否,用于表示是非的逻辑; - 对象:用于表示一个集合,包含各种属性或者变量的信息,可用于复杂的调用; - 数组:用于表示一组变量,调用时可以以数组的形式依次调用。数字、文本、布尔、对象、数组) ##### 为什么会有丰富的数据格式 我的理解是在写程序的时候,需要实现不同的功能,就会用到不同的数据类型。就像常用的Excel表格中,会有单元格格式的不同,比如日期格式、文本格式、货币格式等,都是为了更好的服务于使用者。在定义变量的时候就想好这个变量的使用场景,就能确定这个变量的类型(虽然在用var定义时看不出来)。 买的指南还没到,目前只看了一些百度google的浅显内容,随着学习和实践,理解会更深刻。 #### 静态网页布置 https://andreajiang.github.io/html02/ 好简陋,没增加内容,只做了一些替换。 #### 问题 1. Git的终端和win自带的终端有区别吗?操作指令看起来都是一样的。 2. 在运行sample_code.js时,一开始我怎么都运行不出来,总是报错: >C:\Users\JL\my_project\sample_code.js:10 > ><<<<<<< HEAD > >^^ > >SyntaxError: Unexpected token << > >​ at createScript (vm.js:74:10) >​ at Object.runInThisContext (vm.js:116:10) >​ at Module._compile (module.js:533:28) >​ at Object.Module._extensions..js (module.js:580:10) >​ at Module.load (module.js:503:32) >​ at tryModuleLoad (module.js:466:12) >​ at Function.Module._load (module.js:458:3) >​ at Function.Module.runMain (module.js:605:10) >​ at startup (bootstrap_node.js:158:16) >​ at bootstrap_node.js:575:3 后来各种查和试,在sample_code.js里把最开头附近的 `<<<<<<< HEAD` `=======` `>>>>>>> upstream/master` 这三行,删了或变成注释,再运行,才好了。但是不明白原理是什么。麻烦老师解答。 3. 在静态网页布置的时候,一开始我用老师的文件布置了一个,然后按照课上讲解的直接在GitHub上改动Html文档,但是改动了之后,点击原来的网址,网页没有更新内容,这是为什么呢? #### 笔记 ##### 部署一个静态网页 - 在项目里加入html的文件 - setting ——> GitHub Pages ——> Source(master branch)save ##### 一切以命名开始 先命名,再生小孩,再关联 属性,关系。名字和目标的关联:名字不代表这个具体的目标,而是代表属性和关系的集合。 程序的目的是什么:处理数据,得到结果。 var是js唯一的变量属性。var output="Hello,JS"; 变量,要先声明再定义。 JS里单引号和双引号一样。 对象变量:定义用冒号,而不是等号。对象变量是包含各种变量、数组的集合(自己理解的概念)。 先用写代码的软件写好代码,再用node执行。 `>node simple.js` ================================================ FILE: homework/lesson2/langjianjun.md ================================================ 第二节课总结 编程中为什么会有丰富化的数据格式? 丰富的数据格式是因程序要处理复杂的现实问题而产生的。 比如,字符串是对应生活中的文字的,需要保持原样;而数字则分为整数和浮点数,后者对应数学中的实数;而数组则可对应坐标、数据表格等。 正是因为这样的数学处理,电脑程序才能更好地解决问题。 作业拖了太久,马上要上课了,请老师原谅我这老学生草率的作业。 ================================================ FILE: homework/lesson2/leizhen.md ================================================ 编程中为什么会有丰富化的数据格式? 为了高效。 不同的格式可以互补短板 我把编程类比成雕刻师傅,数据格式类比成雕刻刀 雕刻刀的种类也有很多:平刀、斜刀...... 用一把刀去雕刻当然是没有问题的,但是会用其他的刀,大大提高了效率嘛。 个人主页:https://rainyuzi.github.io/ ================================================ FILE: homework/lesson2/lichen.md ================================================ ###编程中为什么会有丰富化的数据格式? 一切从命名开始,从命名开始,我们得以操纵变量和数据。 这个世界所有的存在的事物背后都有很多属性、特征。 自然语言是人类用来处理特定目的。 数据就是语言的编码,从而处理数据,得到结果。 ####为什么会有丰富化的数据格式? 方便描述对象的特征,有些特征比如身高体重年龄等比较适合用数字来描述; 性别、状态比较适合用布尔值来描述; 说话的内容可以用字符串的方式来描述; 集合性质的数据内容适合用数组来描述等。 也就是说不同的数据类型,我们可以使用不同的格式来对应它们,从而制定编程规则来操纵它们为我们实现目的。 拥有了不同的属性,我们就可以通过一系列方式将属性存储到对象上面,这样对象就等价于这些属性的集合。 ####静态网页 github pages: https://lichen19844.github.io/static-web-page/ ================================================ FILE: homework/lesson2/lingxiao.md ================================================ # 编程中为什么会有丰富化的数据格式-JavaScript第二次作业 ## 作业 【作业要求】 1. 熟读getting-started-with-javascript/study/lesson2/smaple_code.js代码。用node环境和浏览器环境运行一下代码(注意:浏览器运行请使用my_personal_info_page.html) 2. 写一遍课程总结,题目为:编程中为什么会有丰富化的数据格式? 3. 如果有问题,在总结中把你的问题罗列出来,我会做解答。 【附加作业要求】 4. 在github上部署自己的静态网页,把网页地址放在总结文档里。 【提交方式】 5. 请向getting-started-with-javascript项目发起pull request。 https://github.com/xugy0926/getting-started-with-javascript ## 答案 1. **Demo代码运行结果** | Node环境运行结果 | 浏览器环境运行结果 | | :--------------------------------------: | :--------------------------------------: | | ![Node环境运行结果](https://github.com/LydiaLing/MyPostImage/blob/master/Js_Homework/Lesson2/Node%E7%8E%AF%E5%A2%83%E8%BF%90%E8%A1%8C%E7%BB%93%E6%9E%9C.PNG?raw=true) | ![浏览器环境运行结果](https://github.com/LydiaLing/MyPostImage/blob/master/Js_Homework/Lesson2/%E6%B5%8F%E8%A7%88%E5%99%A8%E7%8E%AF%E5%A2%83%E8%BF%90%E8%A1%8C%E7%BB%93%E6%9E%9C.PNG?raw=true) | 2. **编程中为什么会有丰富化的数据格式?** 为了描述这个世界,人类发明了计算机,而我们现在讨论的数据格式,也即是**数据类型**,其实更直接的是计算机里的数据类型。 > 数据类型(Data type)是用来约束数据的解释。在编程语言中,常见的数据类型包括原始类型(如:整数、浮点数或字元)、多元组、记录单元、代数数据类型、抽象数据类型、参考类型、类以及函式类型。数据类型描述了数值的表示法、解释和结构,并以算法操作,或是物件在内存中的储存区,或者其它储存装置。-- [wiki百科](https://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E9%A1%9E%E5%9E%8B) 大家知道,目前我们用的均是冯氏体系架构的计算机,其核心思想是存储程序,执行程序。而程序本身,也只是一种数据代码。即,数据从外在来看,可能就纯的数据本身,也可能是代表一段执行代码,也可能代表一定格式的程序或是文件。现代计算机,由于硬件设计上的限制,均采用的是二进制体系。那么在二进制的编码下,就产生了各种各样的数据类型。 尽管有各种各样的数据类型,但人们总是在想方设法的去追求一个目标,即,用尽可能少的空间,存储尽可能多的信息;就尽可能少的运算,呈现尽可能多的信息变换。而通过数据类型限定数据的范围,相当于加了范围约束,这种约束有如下好处:1)使用优化的存储格式,比如INT类型是四字节,存储格式为32位二进制字符,而varchar表示 “9999999999”则需要10字节(甚至更多,取决于DBMS类型);2)在对该类约束数据实现某些操作就不再会报错,比如日期类型 ‘2017-3-28 00:00:00’就可以无障碍的通过内置函数转换为任何等价形式,比如"28/3/2017" 或者"2017年3月28日 0点";3)通过数据类型约束可以减少非正常数据的存入,比如INT类型的列不应该存入字符串。一句话概括,有了数据类型,才能更好的分配管理内存,节省不必要的开支,可以处理一些非法输入。[^1] 在实际编程中,我们知道,任何编程语言(除了汇编,汇编只规定数据的字长),都会有自己的数据类型,而对一个程序员来讲,写代码的第一件事情就是定义数据类型。在数据类型背后,隐藏的是编译器或者解释器对数据处理方式的定义。知道了这个以后,我们在定义数据类型的时候,就应该知道,我们定义的这种数据类型,可以进行哪些操作,这些操作的规则是什么,这样我们才算真正掌握了这个数据类型。[^2] 3. 木有... 4. **我的静态网页:** https://lydialing.github.io/MyStaticWebpage/ [^1]: https://www.zhihu.com/question/54104439 [^2]: http://5412097.blog.51cto.com/5402097/1626125 ================================================ FILE: homework/lesson2/linxiyao.md ================================================ 编程中为什么会有丰富化的数据格式? 编程中有丰富的数据类型,比如数字数据(170),数组数据(170,120,18),文本/字符串数据(height),组合数据/对象(height:170,weight:120,age:18),布尔数据(true or false)等。 不同的数据有不同的作用,可以实现多样化的目的。同时,不同的数据本身在系统中的存储、运算、传递效率不同,这些不同的数据类型决定了代码执行的效率。这样说来,编程中我们应该尽量选择简单的数据类型以提高代码执行效率吗? 个人静态网页https://linxiyaolxy.github.io/getting-started-with-javascript-homework-lesson2/ ================================================ FILE: homework/lesson2/lipeng.md ================================================ ## 编程中为什么会有丰富化的数据格式? 1 对应真实世界的数据状态。 比如我的年龄,那就是一个不超过3位数的整数。而提到我喜欢的食物,那么就是一大串了。 再比如,描述一个公司的架构,那么就是一层一层的金字塔结构。 2 统计所有业务中的数据类型,几乎是无限的,但这个无限,用编程语言的有限的数据格式表达出来,这相当于是某种程度格式化的数据,方便计算机高效处理。 网页地址: https://5haydn.github.io/JS-Startup/ ================================================ FILE: homework/lesson2/litao.md ================================================ # 编程中为什么会有丰富化的数据格式 标签(空格分隔): 作业2 ---------- 世间存在的一切事物都要有个名字,即使用一个代号表示,也是对于它的一个命名,所以说命名是一切事物的基础。 而我们对于这个事物的认识,是通过了解它背后具有的属性、关系等信息获得的,所有这些信息都属于数据的范畴。将这些数据输入到我们的大脑,大脑就相当于电脑的中央处理系统,经过大脑对输入数据进行一系列的运算处理,最终得到我们想要的结果。 从输入到输出的中间处理过程,就类似在电脑上运行程序的过程。所以说,程序就是:处理数据,得到结果。编程就是要用计算机能识别的语言编写数据代码,让计算机处理运行这些程序,最终得到结果。 从我们对一个人起名字开始,我们要通过对这个人的属性特质职业等一系列内容的描述,人们才能清楚这个人是谁。由文字形式描述,到格式化方式描述,再到符号化方式、伪代码方式,最后到数据代码方式,经过这一系列的格式变化,我们看到每种格式的作用与不同。 由名字就引发出变量的定义,名字中包含许多变量,这么一堆不同的属性关系等变量就构成这个名字代表的一个事物,从而我们就识别出是什么事物。这些名字也相当于许多的数据,数据就要对应不同的数值。数据的表现形式,也就是数据格式也很多样化,根据变量的不同呈现出不同的数据格式。总的来说,编程面向的对象就是变量和数据。 在JS中,首先要声明一个变量,然后再定义这个变量,最后给这个变量赋值。 [李涛在GitHub上的静态网页][1] [1]: https://www.github.com/litao0715/Melody-0715 ================================================ FILE: homework/lesson2/liujuanjuan.md ================================================ ## 听新生大学CTO讲JavaScript编程入门-2 by刘娟娟 2017-08-18 这堂课,老师依然用类比的方式,教我们认识编程世界的一个重要概念。 名字 = 变量 **命名**,是个哲学话题。现实世界中,为什么人、物、万事均有名字?没有一个名字,我们该如何指代ta呢?我们说到一个苹果,如果只能把那个苹果拿到眼前,那当我们吃掉它,或者在另外一个地方在谈论它时,又该如何指代它? **等同吗?**名字能代表一个人吗?不能。名字用来指代一个人,但不能代表这个人。能代表这个人的,是他的一堆属性。比如身高、体重、性格、DNA、社交关系等等。_属性,除了属性的名字,还有属性的值。没有值的一个名,是没意义的。_ **以此类比**,在代码的世界里,我们用各种各样的**变量**名,来指代那些我们要用代码操控处理的对象。 我们需要命名,并把名字关联到具体的那个对象。变量需要先申明、再定义。 var myName; myName = '刘娟娟'; 这2行语句可以简写为: var myName = '刘娟娟'; 但,我需要记住的教训是:**只有变量名而无赋值的变量,是没意义的。** 在代码的世界里,变量有很多类型。有数字、字符串、数组、对象等等。为什么要有这么多的变量类型呢?因为变量本身就有那么多类型吖!_这个解释真是令人崩溃吖,老师此刻哭晕在办公室。_ **编程中为什么会有丰富化的数据格式?** **不同的变量类型,是为了实现存储、传输、计算的效率最大化。** 存储占用硬盘空间,传输占用带宽流量,计算占用内存空间等等。不同变量类型所需要提供的字节大小是有差异的,既满足需求,又要实现效率最大化,于是发展出多种数据类型。 好消息是,**JavaScript中,变量的申明和定义,只需要一个var即可,它会自动处理变量的类型。** ## 本课知识点: 1、如何定义变量? _直接用var+空格+变量名称;即可。_ 2、JS如何处理变量类型? _自动识别处理,无需编写代码的人操心。_ 3、变量命名有哪些技巧或规范? _英文,各种各样的形式,个人比较喜欢的是小写单词+后续单词首字母大写的驼峰模式。_ 4、怎么掌握变量技巧和规范? _不要背,看看老师和教程的sample,自己试着用用,用多了就融入骨子里。_ ## 编写代码,本身如同讲话、写作,就是一种表达。 第2节课有一个令人印象深刻的演进过程,即从一段正常描述的文本,逐步拆解成程序的语言。让我等小白讶然:原来编写代码这么简单! 因为在写这篇小结时,我已经听了第3、4节课程,我越发觉得:把事情想复杂了,反而难以为继;简单点,恢复它的本原就好。 ================================================ FILE: homework/lesson2/liujun.md ================================================ # 编程中为什么会有丰富化的数据格式? ## 数据格式的种类 数据格式有许多种,我目前知道的有:布尔型,字符串型,数组,整型,列表等。 它们也可以随意组合,任意调用。 ## 编程为什么会有丰富化的数据格式? 老师讲课时,用定义小明的方式来类比编程里的变量和值。小明作为一个独一无二 的个人,有许多只属于他自己的特征,比如,DNA,身高,体重,家庭关系,兴趣 爱好等,这些都是用不同的方式表现出来的。这些类比到编程里,我们很容易得出 一个结论:单一的数据类型,不能满足我们的编程需要,用单一的数据类型,创造 不出一个丰富多彩的世界。我相信没有一个数据类型是多余的,是凭空造出来的。 每一个数据类型都有它独特的使用环境。 作为一个小白,刚开始学习编程的人来说,我觉得应该弄明白每一个数据类型的用 途,找到使用数据类型个最有效方式。以上是我的理解。 ## 我的个人静态网页 https://liujun009.github.io/liujun/ ================================================ FILE: homework/lesson2/liuliyuan.md ================================================ ##第二次作业 变量和值 1、在编程语言中,能够表示并操作的值的类型称作数据类型。JavaScript的数据类型分为两类: >原始类型:数字、字符串、布尔值,null/undefined >对象类型:数组,函数,日期类,正则类,错误类 **Notice**:区分字符串和数组,字符串是一组由16位值组成的不可变的有序序列,JS通过字符串类型来表示文本;数组是带编号的值的有序集合。 --- 2、JS中的数据类型转换非常灵活 刚开始看到这点其实是有困惑的,既然各种数据类型可以灵活转换,那为什么还要那么多种数据类型呢? 后来看到一段代码中有说字符串的length,才把我的注意力拉到存储空间上,应该是不同的数据类型存储空间不同,如果数据类型单一的话,都定义成大的话,耗费的存储空间就要大很多,运算速度也会很慢。 而JS中数据类型灵活转换,更是方便了我们进行运算,增快运行速度。 **Notice**:老师在第三节课所讲,不同的数据类型决定了代码执行的效率。效率包括:存储效率,计算效率,传递效率。 --- 3、函数作用域和声明提前 JS函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的,这意味着变量在声明之前甚至已经可用。(声明提前)。在第五节课中有同学提到了这个问题,老师回答了以后自己其实不是很懂,后来看犀牛书P57页有相关的介绍及例子,才算是真正懂了。 **Notice**:虽然自己是因为不好好写作业,现在才来看书补作业,但是当你学到后面,再来看前面的知识时,你发现之前很多不懂的东西都会联结在一起,不知不觉中它们已经构成网络,让你可以理解。从另外一个角度看,我们总是在进步的,多么令人觉得理所当然又匪夷所思的一件事啊。 --- **[刘丽媛个人页面](https://xlillian0507.github.io/test/)** ================================================ FILE: homework/lesson2/liuqing.md ================================================ ## 编程中为什么会有丰富化的数据格式? 在照着老师的sample_code.js文件自己一字不差敲了一遍之后,才慢慢加深了对语句中的各种类型代码的熟悉感。 一方面,各种不同的数据类型有不同的格式要求;另一方面,在定义一个变量的时候,也有好几种不同的格式: > 简单数据类型有5种:number、Boolean、string、null、undefined; > > 还有一种复杂数据类型:object 为什么会有这些不同的数据格式呢?我认为有以下这些可能: 1. 为了使V8引擎便于解释代码。针对不同的变量来赋值给不同的数据类型,代码运行时,便于解释器解释,不至于造成信息产误解或理解歧义 2. 采用不同的数据格式,可以减少对内存占用的浪费; 3. JavaScript属于边解释边执行的代码,为了提高运行的速度,所以采用丰富的数据格式; 4. 使用不同的数据类型,还有可能便于程序员或者其他人阅读和理解(?) ## 存在的问题: 1. 空格和标点应该注意切换为英文半角 2. 驼峰命名法:变量名称开头小写,后面每个单词的开头字母均为大写 3. 数据类型中要特别注意的地方: 1) 字符串要有单/双引号加持保护; 2) 数组由方括号包住,里面的字符串由英文半角引号各自包住,并由英文半角逗号隔开; 3) 变量可以并列一起,中间由逗号隔开,e.g. var height = 110, weight = 165; 4) 把多个数据(值),用花括号圈起来,还可以相互嵌套,然后就变成了对象; 5) 布尔型的,只有true/false两种,再无其他。 4. console.log('\n') // 换行的意思,不要忘记还有英文半角的分号哦 在console.log()的括号中可以输入各种好玩的符号和文字,用英文半角单引号包住,在运行node的时候会出现你先要的各种分栏和图案,非常有趣。 ## 静态网页网址 https://elleph.github.io/homework/ ================================================ FILE: homework/lesson2/liuruyong.md ================================================ # 编程中为什么会有丰富化的数据格式? 现实生活就是复杂的,像课上讲的小明的例子,身高是有小数的、年龄一般用整数、朋友关系要用数组表示、每个朋友都是一个独立的对象。。。 为了描述现实生活中的问题,就需要相对应的数据类型存储数据。由此抽出了6种原始类型(Boolean,Null,Undefined,Number,String,Symbol)和对象。 丰富化的数据格式因为拆分的细,所以使用很灵活。即使碰到复杂的数据格式,也可以用基础类型通过搭积木的方式组合出来。 另一方面,丰富化的数据格式也方便人类理解应用。javaScript内建多种数据格式后,可以把格式相关的细节预先处理(例如,字符串拼接,不同类型的转换),使用者就不需要考虑这些细节,简化了编程工作量。 # 静态网页地址 [Git部署静态页面](https://liuruyong.github.io/jsTest/) ================================================ FILE: homework/lesson2/liushengsi.md ================================================ # 编程中为什么会有丰富化的数据格式? #### 1. 我们为什么要编程呢? 人类的进化史可以说是一部效率的提高史。进入现代文明社会后,我们的现实世界越来越复杂,比之前古老的农耕文明社会不知道复杂了多少倍。然后计算机诞生了!计算机的工作方式让人类社会的很多社会活动的效率有了质的飞跃,也把人类从很多社会活动中解放了出来,比如:复杂的数学计算、产品品质的筛选等等。 所以,编程有一个很重要的目的就是从复杂的现实社会抽象出一些具有共性的处理模式,然后把这些处理模式转换成计算机能执行的代码,让计算机去执行,以提升效率或解放人类。 #### 2. 编程中为什么有丰富的数据格式? 理解了我们为什么要编程后,就不难理解编程中为什么有这么丰富的数据格式了,比如:整型、浮点型、布尔型、字符串、数组等。 因为生活中各方面的事情太多,处理起来的方式也各不相同。就好像: - 新建成一个商场,它的名字叫啥,这种数据往往被抽象成字符串; - 商场今天收入多少、支出多少、盈利多少,这些是需要进行数值计算的,所以更多的会将这些值抽象成整型或浮点型数据来处理; - 商场的共有哪几层、每一层都有哪些品牌入驻,这些需要的处理就不是计算了,而是展示出来,或者商场要做其它业务的时候需要知道这些信息,所以这类型数据更多的会被抽象成数组; - 商场里的品牌哪些是盈利的哪些是亏损的,这些就是“是”还是“否”的问题,基本上会被抽象成布尔型处理; 从一个小小的商场就可以看出现实生活中需要处理的业务的复杂度,所以编程中那么丰富的数据格式就是为了能高效处理各种复杂业务,让我们的效率得到最大的提升。 ================================================ FILE: homework/lesson2/liushengxin.md ================================================ # lesson2 编程中为什么会有丰富化的数据格式? ## 2017年8月13日 某一方面,我认为程序在一定程度上是真实世界的映射。 这就是为什么编程中会有丰富的数据格式。 编程中的数据格式包括这几类。 数字、文本、布尔、对象、数组 真实世界中描述一个事物,大概也需要这几种。 比如描述小明的身高,需要177 这是一个数字。描述他是男是女、需要判断、这就是布尔。描述他的感情经历、这估计得一大段话了、这就是文本了。描述他有几套房子、几套车子、去过哪些地方、上过什么学校,这就需要对象和数组了。 而编程语言把这些抽象出来、形成丰富的数据格式,是为了方便计算机进行数据处理。因为编程最后需要变成010101010这样的语言、不同的内容需要严格的定义。 通过对数据格式的丰富化、一边方便了人类编程、一边也方便了机器编译。 [静态页面链接](https://somexin.github.io/homepage/) ================================================ FILE: homework/lesson2/liuxiaohaohao.md ================================================ #JS第二节课总结 ##学习的习惯养成 1.微信不是学习编程的唯一途径,不要过分依赖。 2.遇到问题先尝试思考,自己动手去解决。 3.解决不了,自己去谷歌,百度搜索,寻找答案。 4.最后实在不行了,再回来到群里寻求小伙伴的帮助。但寻求帮助时,要清楚的描述自己遇到的问题的环境,忌一张图一句话的简单粗暴的方式。 **请教别人的时候,请让对方看到你为此付出的努力。这样才做到了对他人,对自己,对知识的尊重。** ##我理解的数据 我们人的大脑就像是计算机的中央处理系统,我们通过感官接收到的一切,都会传递到大脑里进行数据的处理。 比如,我们看到一个可爱的小孩子,那么这个小孩子“可爱”的属性就是一个数据;在“可爱”这个属性之下有“眼睛大”,“脸圆圆哒”“嘟嘟嘴” 等一些特征也是数据。 再比如,我们通过眼睛看到苹果的颜色是“红色”,这是一个数据;我们通过鼻子闻到了苹果的“甜香气”这是一个数据;我们咬一口苹果,感觉 “甜中酸”“水分充足”这也是数据。 人类世界真是因为有了很多数据才会如此缤纷多彩。 ##那编程为什么会有丰富化的数据格式? 首先,程序的目的是“处理数据,得到结果”。 数据给到程序,程序进行处理,然后输出结果。这个过程是需要时间的,而丰富化的数据格式可以缩短这个过程所需要的时间,提高运算的效率。就像在马路上遇到 熟人一样做到“毫秒级的运算处理”,开口说:“Hello!How's it going.” 第二,编程的世界,其实是人类模仿自然建立起的一个虚拟世界,之所以会有丰富化的数据格式,是因为我们所处的世界本身就有丰富的数据格式化啊。不同类型的 工作,会有不同的操作流程,不同的制度,不同的......就是因为这些不同的交汇才产生了“世界”。如果,人类以另外一种形态存在着,可能那个世界的编程就会 是另外一个模样吧。 >代码不重要,解决问题的方法更重要。 任何时候都不能忘记“思想”是前提,你要知道你为什么做这件事?这件事的本质是什么?为什么学这个东西?有没有更好的方法去做? ================================================ FILE: homework/lesson2/lixiang.md ================================================ # 编程中为什么会有丰富化的数据格式 标签(空格分隔): 未分类 --- PS: [作业链接][1] https://ideal1985.github.io/ideal/ **A. 体现真实而丰富的世界** (输入角度) > 一个教编程的老师总留语文作业让写总结,挺有意思的吧!挺聪明的!因为让学生输出的过程就是在push大家input,而后的output中,学生们伴随思考,查资料等等辅助行为,无疑学习效率和深度>>>单纯的听听课而已。再则,通过看学生的总结文章,老师也能大致了解学生的掌握程度,从人脑力直接提取第一手的feedback。我只能说,这招,太狠了! ---这个世界原本就是错综复杂的,有文字、数字,有文字和数字之间的关系,也有文字与文字之间的关系…… 编程无非也是一种语言表达,抽象地描述这个复杂的世界,单一种类的数据格式当然不够用。 所以,丰富化的数据格式只不过是不同的描述方式,最终都是为了让计算机客观地理解这个复杂的世界。就像老师让我们写总结、敲代码、自学教程,这些过程都可以让我们自己看到更多面的自己。 --- **B. 满足计算需要** (输出角度) 比如咱们需要计算机帮助我们找人。 光提供姓名,年龄够吗?这两种数据没办法pin down到自己想要的答案。 那就继续,性别,出生年月,工作单位,毕业院校,情感经历。 或者 直接手机号码或者身份证号码帮助锁定。(虽然这些例子里只提到了“字符串”和“数值",但我想未来理解得更多的时候写出来的内容一定会更深刻!) 不同的数据种类可以方便计算机整合信息,用最高效的方式帮我们实现目的。 --- **C.为创新提供基础** (发展角度) 环保主义者们在鼓吹环境威胁论的时候,经常谈及"物种多样性”受到威胁,即他们默认物种灭绝是不好的事情。就好像同一类物种里的sub-species灭绝会影响基因的多样性,数据格式单一注定是会影响发展的(我猜的)。更丰富数据种类意味着组合交叉的可能性指数级增加,这也就意味着会有更多科技创新的可能性吧(我推测)! [1]: https://ideal1985.github.io/ideal/ ================================================ FILE: homework/lesson2/liyihang.md ================================================ #为什么有丰富化的数据格式? ##数学思想 编程的数据是基于数学来设计的,有部分数据结构的思想来自数学,基本的自然数,无理数,集合,序列,布尔。 ##计算机思想 根据数据的特性结合内存物理特性,把数字分浮点和整形。 根据软件工程理论,出现了类和对象 设计程序语言时,把未定义的数据为NULL,Undefine ##世界的原生数据 字符串 #附:数据结构 基本数据结构(数字,字符串) 列表,字典 对象 #静态页面 https://baidang201.github.io/gitPageTest/ ================================================ FILE: homework/lesson2/luoruijun.md ================================================ # 编程中为什么会有丰富化的数据格式 数据格式有:基本数据(数字、文本、布尔等)、数组、组合数据(对象数据),不同的类型的数据操作方式不同。编程要有不同的数据格式,估计是和计算机对数据的辨识有关,处理不同类型的数据是用不同的方式的,不同数据类型所占用的资源(内存)也是不同的,另外可能也是考虑到处理效率的原因,因而有不同的数据格式。 https://sunrise81.github.io/sunrise-personal-web/ ================================================ FILE: homework/lesson2/marshalcy.md ================================================ ##编程中为什么会有丰富化的数据格式? ###提交人:Marshalcy ####已知数据格式 现在,我知道的数据格式有:数字,文本、数组,对象,布尔。
#####1)数字 1.1)数字可以带小数点,也可以不带;
var x1=34.00; (使用小数点来写)
var x2=34; (不使用小数点来写)
1.2)极大或极小的数字可以通过科学(指数)计数法来书写
var y=123e5; ( 12300000)
var z=123e-5; (0.00123)
#####2)布尔 布尔只有两个值:true 或 false。 #####3)数组 数组表示有序数据的集合;
比如有一个数组a:
var a=["1","2","3","4"] #####4)对象和文本 对象和文本,我也搞不清楚,还有在w3school上有看到,字符串,Null,Undefined,分别是什么也不知道。
Google了一下,有人说,数组就是有序数据集合,对象是无序数据的集合,具体还是不太懂。
应该还有一些不知道。 ####为什么有这么多?? 为了更效率的使用不同数据,能在一开始就知道这串数据是什么;
举个例子:菜刀、炒锅、蒸锅、有什么用砧板、汤勺都是厨具,但是我们不会把他们都放到一起吧,还是会分别放置,比如菜刀会放到刀架上,炒锅蒸锅常用的会放到炉灶上,不常用的收起来等等。 #####个人静态页地址:https://marshalcy.github.io/myHome/ ================================================ FILE: homework/lesson2/panqi.md ================================================ # 第二次作业 ## 上周末补写作业遇到的问题 ### node环境无法运行代码。老师和同学们通过不同渠道给出了方法,自己尝试着照做仍然不对,当时最大的困惑是不知道应该进入哪里完成。开始进入了电脑终端,找错了地方;后来进入vscode终端,地方是对了,可新领域的各种操作又茫然了,都没有成功。大脑中总是有惯性思维,正如开始老师要求在终端创建文件夹,自己傻傻的在电脑桌面上新建个文件夹,后来知道了怎样进入电脑终端,可脑子中以为只有这样一种终端,没有注意到在vscode查看中有集成终端功能。 ### 初写代码只是机械模仿,缺少必要的思考和理解。终端运行遇到障碍后,心想按照老师的示例把代码从头到尾敲出来,再尝试运行一下,敲的过程中对于变量类型和格式加深了认识,但看着一行行、一段段、那么长的代码,还是有些发懵,最终也只是半途而废。 ## 上周末补写作业完成的内容 ### 使用浏览器运行了代码。 ### 依葫芦画瓢部署了静态网页。当时回放已经关闭了,通过搜索王沙沙同学在微信群里列出的详细步骤,逐项操作,完成了该项内容。网页地址:https://bigcat0521.github.io/ ## 再写作业时的感受 ### 课程回放一定要全部至少看一遍,也有必要多温习。除了昨天的回放还没有全部看完,之前的回放都看过了。曾经懵懂的内容,随着课程的推进,和老师贴心的不断强化、补课、答疑,不再觉得那么难以理解了,这是看过课程的感觉,关键还是要在自己补写作业中,检验是不是真的越来越能理解了。对于vscode的使用逐渐进入状态,有时候被卡住的某个点,可能在某个时间忽然就弄明白了。 ### 老师推送的topics和issues,还有同学们贡献的问题、答案、总结、作业等等,倾注了大家的心血和热情,有疑惑、有思考、有进步、有成长,值得多学习、反复看,对照总结自身的差距,加快追赶和提高。 ### 买回来的犀牛书也要好好使用。学习中有些知识点还是需要抽出时间好好自学的,毕竟课程的时间有限,老师为大家传授的更多是一种编程思想,很多具体的内容和操作还是要自己投入时间去学、去练。 ### 多样化的数据格式包括数字、文本(字符串)、布尔(true\false)、对象(集合数据)、数组(一组数据)。程序的目的“处理数据,得到结果”。变量先声明后定义。 ## 阶段性小结: ### 课程已经过去大半了,看到很多同学都能跟上老师的节奏,一方面他们投入了大量时间,另一方面也是积极踊跃的提问、讨论、交流,而自己的学习进度缓慢,已经慢了很多拍,着急、焦虑并不能改变这种状况,自己会尽最大努力去复习和补写作业,但是想要很快达到一个更高的水平有一定难度。对于自己来说,当课程结束时,一定是有收获的,在接触这个陌生领域的过程中,每学到一样新东西、完成一个新任务,内心是充满喜悦的。遇到认真、负责、贴心、温暖的高阳老师,还有一群热爱学习、持续成长的同学们,不只是学到一门知识,更多是被这样一种氛围感染和熏陶着,如此之幸运! ### 有新鲜感的两件小事,现在打开网页会特别留意左下角的进程和提示,以往只是简单的双击动作,背后蕴藏着各种丰富的交互和数据处理;学习过的功能也会尝试在单位电脑上试用,通过检查调取了工作中经常使用的一个业务系统的代码,几百行,看得眼花缭乱,结构大体能看明白,每行的具体意思就不是很清晰了,平常工作使用时,从未想过背后的复杂结构搭建和逻辑关系。 ### 关于作业提交的markdowm格式,百度、看同学介绍,很多种方式可以实现,最后选择在vscode中完成,只是简单用不同“#”区分了层级,交作业之后并未看到象其他同学那样呈现出的整齐页面感觉,不确定这种方式是否正确;此外,在这里面打字,感觉和word没有什么差异,就是多了几个“#”,可能是自己并未掌握,自认为这种格式是为了便于将来能够将其转化为网页,说不好,先按自己理解这样应用着吧,也许哪天又突然开窍了呢! ### 有意识的使用快捷键了。平常经常用的就是word和excel,但基本没使用过快捷键,前两天单位换了Wps,查找方式和原来不一样了,问了一下同事,一句ctrl+f,轻松搞定,原来以前忽略很多快捷方式,如此多多费了不少时间啊!今天又记住了ctrl+`(集成终端)和ctrl+s(保存),方便很多! ================================================ FILE: homework/lesson2/panyong.md ================================================ # 【第二次作业】变量和值 【作业要求】 1. 熟读getting-started-with-javascript/study/lesson2/smaple_code.js代码。用node环境和浏览器环境运行一下代码(注意:浏览器运行请使用my_personal_info_page.html) 2. 写一遍课程总结,题目为:编程中为什么会有丰富化的数据格式? 3. 如果有问题,在总结中把你的问题罗列出来,我会做解答。 ## 总结 ``` 编程中为什么会有丰富化的数据格式? ``` ``` 答:世界多样,编程时需要多样化的数据类型来更好的表达。数字、文本、布尔、对象、数组,在计算机底层不过都是0和1,只是在编程语言上抽象出了丰富的数据类型,方便人与人之间去沟通表达、阅读理解。 ``` ================================================ FILE: homework/lesson2/qiujingyu.md ================================================ ## 编程中为什么会有丰富化的数据格式? #### 学习代sample_code.js码心得 + 用var来声明变量,用的是赋值语句。 + 定义变量时,"=" 不是代表等于,而是指“得到或者赋值”,等于是"==",严格相等是"==="。变量不需要单引号或者双引号。赋的值如果是字符串则要添加引号,其他的如数字、布尔值则不需要。赋的值还可以是对象,用花括号括起来;也可以是数组,用中括号括起来。 + 变量名如果是两个或以上的单词组成时,一般从第二个单词开始,每个单词的首字母是大写,如isMan、myLikeFoods 。 + 双斜线//之后的内容都属于注释,不会在终端显示出来。/* */之里的内容也属于注释。 + console.log()是函数来的,用来输出代码结果 + \n 是换行符 + 数组的里的数据排序是从0开始的,也就是说如果需要找出第一个数据,不是[1],而是[0],[1]是第二个数据。 #### 丰富化的数据格式 数据格式有数字、文本、布尔值、null和undefined、对象、数组、函数等。往大的说,丰富的格式才能对应复杂的现实情况。往小的说不同的格式可以用来描述不同的情况;通过运算符、语句来定义操作这些格式,达到处理数据,得到结果,实现功能的目的。 #### 个人静态网页地址 https://qiuyixiu.github.io/yixiu/ ================================================ FILE: homework/lesson2/shaozhen.md ================================================ ## 编程中为什么会有丰富化的数据格式 ### 数据类型的划分有助于更好的分配管理内存,节省内存的开支。 ### 丰富的数据格式可以满足描述对象的需求,用多样化方式来描述数据。 ### 多样化的数据格式,使程序可以更准确的处理抽象出来的数据,得到想要的结果。 [静态网页](https://naliang.github.io/naliang/) ================================================ FILE: homework/lesson2/shenzhili.md ================================================ #编程中为什么会有丰富化的数据格式 JS中的数据格式有数字(number),字符串(string),布尔(boolean),对象(object),数组(array)。这些数据格式,每一个都有它的用处,但这些数据格式都是准确的描述/表达的基础。 **存在即是合理————一件事物经受住了时间的考验,一定有它的道理。** 笑来老师讲过一个流程图的故事,曾经,人们认为流程图至少要5个元素,这一说法流行了好几年,直到后来有一个人(具体人名忘记了~)提出,描述流程图只需要三个元素。分别是:顺序、条件、循环。这个理论改变了世界,刷新了人们的认知。事实上,全世界的所有流程图分解到最后确实只剩下这三个类型。换句话说,这三张流程图是流程图界的基础元素,管他多复杂的流程图,都可以用这3个元素组合搭配构成。 说回到JS中为什么会有丰富化的数据格式。道理是类似的,可能在过去,数据格式要么冗余或简单的过分而缺少必要功能。经过程序员的不断增删,修正,最后留下来的可以说是简单、有效、必要的数据格式(至少目前来看是这样的)。 可以说,之所以有今天这么些个数据格式,是前人经过实践总结出来的。这些数据格式在实践中被无数次地证明是有效的、被需要的。 编程中丰富化的数据格式对应着实践过程中的需要(必要)。 以上。 ------- github上的静态网页: ![优秀站点收录 ]https://zjutszl.github.io/ ================================================ FILE: homework/lesson2/sophieQi.md ================================================ ### 编程中为什么会有丰富化的数据格式? >数据格式(data format)是数据保存在文件或记录中的编排格式。可为数值、字符或二进制数等形式。由数据类型及数据长度来描述。 在课程中的一个例子,小明是不是一个具体的人。答案:不是。 生活中存在着很多小明,那怎样来区分小明? 用构成小明的数据来区分。包含小明自己的属性和关系组合。比如小明的身高、体重、年龄、DNA、家人、朋友等。 ![](https://i.loli.net/2017/08/17/599541a48e920.jpg) 这些变量使用了不同的数据格式。 ## 程序的目的是——处理数据,得到结果 ### **对变量先声明后定义,再给这个变量赋值。** **数据类型是与程序中出现的变量相联系的数据形式。** ![](https://i.loli.net/2017/08/17/599542846346b.jpg) >常用的数据类型可分为两大类。 >①简单类型。其数据的结构非常简单,具有相同的数学特性和相同的计算机内部表示法,其数据的逻辑结构特点是只包含一个初等项的结点.通常有五种基本的简单类型:整数类型、实数类型、布尔类型、字符类型和指针类型。 >②复合类型。或称组合类型或结构类型,是由简单类型用某种方式组合而成的。根据不同的构造方法,可构成以下不同的数据结构类型。 ## 静态网页[my-page](https://klpk011.github.io/js_blog/) 还很简单,之后会继续更新。 ================================================ FILE: homework/lesson2/tangjianfeng.md ================================================ ##编程中为什么会有丰富化的数据格式? 我目前知道的数据格式有byte,int,float,string,bool,array,text,double,currency,date,single,object……等等 为什么编程语言有这么丰富化的数据格式? 首先分类会比较方便程序员知道这个数据是什么,便于操作; 其次数据类型明确了类型的值空间和词法空间,数据类型也提供了多种操作; 第三,数据类型为编译器提供了检查代码错误的能力; 第四,计算机比较笨,很多我们不言自明的人类语言中的数字或者文字,需要让它知道含义了才能正确处理数据,比如数据"19",这个是int还是字符串,还是一个16进制代表的一个Unicode字符?如果没有限定数据的类型,计算机是不会知道其中的分别的; 第五,通过数据类型的约束可以减少很多非正常的数据的存入,比如int类型的列不应该存入字符串; 第六,用相应的数据格式就不会浪费宝贵的存储空间和计算能力。 想看我的主页?请[点这里](https://tangvwin.github.io/js-test/)访问我的github的js学习主页 ================================================ FILE: homework/lesson2/taobao.md ================================================ # lesson2_theSecondHomework_variableAndValue There is little difference between most of classmates and me. My undergraduate major is Electric Enginnering and Computer Science with full English teaching. The instructor of this Javascript lesson, Mr, XU, hopes that we can write the article to sharing the understanding from each lessons with classmates. To be honest, I should keep this one in Chinese but I want to practice my English in this way. I know I will make lots of mistakes but I will try my best. I will make commit to explian something which is important or I do not explian clear. The main idea of lessons2 suggests that what is varable and value in Javascript. The instructor kept the last lesson example in the beginning, envirnment and hand out question Who is Xiao Ming? Then he describe the relationship between varable and value. The point is that Everything starts with varable name then define its value. At here, I explian it in another way. a{b:c;} It comes from css, but their thinkings are in same way. a is the name of the objet (id or group), b is the property of a, and c is the value of the property. // a 是一个名字(由你自己命名,例如:小明),b 是 命名 a 的属性, c 是所定义的值 Js 中写法会不同此处只是帮助理解// Here I put a real example, xiaoMing{eye-color:black;eye-size:big}, we can say "xiaoming has big black eyes". Moreover, the realationship between them in logic is a ---> b ---> c, whcih means that it is single way. You could not come back. Assuming, a is unqiune name, the property b of a, and the value of property b may be same with other object x, object y, etc. It is only value same. Here is another example, xiaoMing{leg-length:long;hair-length:short;} xiaoHong{leg-length:medium;hair-length:long;} even though both have "long" value, but we know that xiaoMing does not have long hair and xiaoHong does not have long leg. //Js 中会遇到Value 一样的, 但是这个Value 的属性和名称应该是不一样,也有少数完全一样的时候是因为其自身的小环境所导致的,相信老师以后会讲,书上也会有讲,可以搜索 local varable and global varable// After talk about the relationship between the varable and value, we should know how to name the varable and what types of value could exist. All JavaScript variables must be identified with unique names. These unique names are called identifiers. Identifiers can be short names (like x and y) or more descriptive names (age, sum, totalVolume). The general rules for constructing names for variables (unique identifiers) are: Names can contain letters, digits, underscores, and dollar signs. Names must begin with a letter Names can also begin with $ and _ (but we will not use it in this tutorial) Names are case sensitive (y and Y are different variables) Reserved words (like JavaScript keywords) cannot be used as names and the types of value : {数字 number [整数init,浮点float,双精准double];} {文本/字符串 String} {布尔(为啥这么翻译,好奇?) boolean} {对象 object} {数组 Array}, undefind and null. Those type of values are priode by JavaScript core, it is basic and loacl service. Now, I would like to talk about the rule of identified. There are three popular identifier naming convention. The instructor shows more than three types in lecture. var height = 170, weight = 130.1; // normal, easy to understanding. var isMan = true; //lower camel case, start with small letter for the first letter of later words use Capital. var wechat_user_name = 'xiaoming'; //Pascal Case, use "-" between two words. At last, offical doc would like to use Hungarian notation, here is the link of information about it. //https://en.wikipedia.org/wiki/Hungarian_notation Addtionally, <\n> in Javascript is meaning make the empty line, and change to the next line. In conclusion, in lesson2, the goal of it is understanding variables and value, the new pint I got from this lecture is the purpose of code is deal with date then output the result, and I need to use the best way to slove my problem. --- additional homework: https://tiandimeihua.github.io/xinshengdaxue_javascript/ ================================================ FILE: homework/lesson2/tuyilang.md ================================================ ### JavaScript编程入门第2课总结:编程中为什么会有丰富化的数据格式? 第二次课的主要内容是: > 1. **命名** > 2. **变量** > 3. **赋值** 而这些内容其实都是围绕一个**基础核心**展开的,那就是: > **数据** 因为**程序的最终目的**,就是: > **处理数据,得到结果** 程序的真正作用就是帮助人们提高处理数据的效率,而我们需要处理的数据实际上是: > **客观世界的数据** 因此客观世界中数据的多样性决定了程序中多样化的数据格式。 #### 数据格式 就拿描述一个人所需要的数据来说,就涵盖了多种**基本数据**格式: > - **数字**,比如年龄,身高,体重,身份证号码 > - **文本**,比如名字,性别,地址,职业,公司 > - **布尔**,比如是否是学生,是否成年,是否结婚 > - **数组**,比如家属,同学,朋友,喜好,它们是一组同类型的数据 更多的时候,为了方便处理数据,我们还需要将相关的一组基本数据组成组合数据: > - **对象**:各种属性的基本数据的一个集合 比如将一个人的基本数据(包括属性和对象)组合成一个对象数据,把一个班的学生基本信息或各科学习成绩组合成一个对象数据。 如何操作数据呢?很简单,但也很重要,就是: > **给数据命名,通过名字对相应的数据进行操作** 命名之后的数据就成为了程序中的变量,之后我们就可以对它进行赋值,修改,处理,输出等操作。 #### 问题 1. 对象里的变量命名和赋值过来的变量的命名为什么可以一样?这样不会引起混淆吗? ================================================ FILE: homework/lesson2/wangshasha.md ================================================ # lesson2 homework 标签(空格分隔): js --- #为什么有丰富化的数据格式 ##数据类型 课上提到的数据类型包括整型、字符型、布尔型,手边正好有一本计算机科学概论,在数据类型这边说到,GIF、JPEG、HTML这样的类型目前还没有成为程序车技的通用原语,可能会快会通用,所以丰富的数据类型是为了尽可能高效的表示不同的信息。 ##数据结构 数组是数据结构,去搜索的时候看到一篇文章http://www.ruanyifeng.com/blog/2009/05/data_types_and_json.html,从结构上看数据有三种类型:标量、序列、映射,标量就是常用的数据类型;序列是数组、列表;映射是字典(就是对象的表示方式?)。数据结构描述了数据之间的关系。 ##数据格式 所以数据格式 = 数据类型 + 数据结构,后面课上也讲到,用不同的数据格式是为了节省存储空间、提升执行效率。 静态网页链接:https://shashawang.github.io/my-first-webpage/ ================================================ FILE: homework/lesson2/wangwei.md ================================================ ## 用node环境和浏览器环境运行一下代码 >#### 1. node环境 ![node](http://a3.qpic.cn/psb?/V10yXgCs06YSTK/4P2Eve64Hhw5LzUPrTCmfAHiV3zThY7kNdHa2JXvpgI!/b/dG0BAAAAAAAA&bo=mQSAAgAAAAARCCA!&rf=viewer_4) >#### 2. 浏览器环境 ![brower](http://a3.qpic.cn/psb?/V10yXgCs06YSTK/jKd0URKxlydo6u.HbSybPWCcag2exdTfG9mEGTWWRVY!/b/dD0BAAAAAAAA&bo=uASAAgAAAAARCAE!&rf=viewer_4) ----- ## 写一遍课程总结,题目为:编程中为什么会有丰富化的数据格式? > 这样才能够尽可能完整的表达现实的世界 > 不不同的数据类型决定了了代码执⾏行行的效率。 >效率包括: >> 存储效率,计算效率,传递效率 ## 在github上部署自己的静态网页,把网页地址放在总结文档里 > https://lightww.github.io/getting-started-with-javascript/ ================================================ FILE: homework/lesson2/wangying.md ================================================ 第二次作业 1.运行代码如下 ![作业2-1-20170814](E:\xinsdx\JavaScript\作业2-1-20170814.png) ![作业2-2-20170814](E:\xinsdx\JavaScript\作业2-2-20170814.png) ![作业2-2-201708141](E:\xinsdx\JavaScript\作业2-2-201708141.png) 2. 课程总结: 编程中为什么会有丰富化的数据格式 1.因为在操作数据之前需要先声明定义变量,而变量就像人一样通过自身的属性和它与其他数据的关系来定义以方便机器辨识。当数据的格式丰富多样的时候才可以多维度描述变量,并使存在细微不同的变量的值成为不同的目标来进行数据处理。 2.不同的数据类型存储时占用内存不同,且其代码执行效率不同——存储效率,计算效率和传递效率不同,满足不同的数据处理需求。 ​ 3. 个人网站URL:https://maggiewong27.github.io/StaticSite/ ​ ================================================ FILE: homework/lesson2/wangyunfei.md ================================================ # Lesson2 作业 ## 编程中为什么会有丰富化的数据格式? ### 一、 本节课程中,开篇运用类比,给一个人起名字,然后通过定义属性的方式来描述这一个人的特征。 #### 在这里,先把本节课中超专业的名词先标注出来。 #### 1、数据。2、数据格式 3、数据类型、4、变量。 5、值。6、赋值 6、声明。 7、定义。其他 这些专有名词,课程中均通过小明、以及小明属性,来进行类比,来阐述专用名词的含义。 首先,啥叫数据,数据又叫啥? 恕我水平低,我以前就只认为,数据就等于阿拉伯数字,数据就是数字,1、2、3、4.... ### 二、 听了第二节视频课程,原来计算机里的数据,不仅仅包括阿拉巴数字,还包括汉字、字母、单词、真与假、、ture与false、以及这些内容混合包装在一起可以形成数组,对象。 #### 数组表示有序数据的集合,而对象表示无序数据的集合。如果数据的顺序很重要,就用数组,否则就用对象。当然,数组和对象的另一个区别是,数组中的数据没有“名称”(name),对象中的数据有“名称”(name)。-----引用一位博主的观点。 不知道这位博主的观点是不是准确,但是网上的观点,只有这句话我能看得懂,希望他说的靠点谱。 计算机中这些庞杂的数据,看似庞杂,其实可以根据其类别进行归纳,于是就形成了一个个派系,简称数据格式。 人们把那些同一类型的数据,就归纳到了一个格式下。就有了数据格式。比如:数字派、文本派、布尔、对象、数组、等。 ### 三、 变量,变量是啥,啥是变量? 顾名思义,变量就是可以变的量。 其实这样解释无疑等于白说,因为我自己也看不懂这句话。 明明一个小孩子的名字叫小明,小明的身高时1.8。 1.8是小明的一个值,int. 这个可以理解。 可是小明咋就成了变量了呢? 难道小明可以变成小李吗? 这也不现实啊。 #### 度娘一下,她告诉我:“变量是计算机编程中的一个重要概念。变量是一个可以存储值的字母或名称。”编程时,可使用变量来存储数字,这个值,可以是数字,单词,或者其他信息。” 为什么起名叫变量呢?因为存储的这个值,会随着程序的运行而发生改变。不同的时间段,这个值会发生不同的变化。使用一个变量来表示不同时间段的值的变化,,而无需在每次发生变化时重新修改程序,将信息存储于变量中。 同变量对应的还有一个词叫“常量”,常量就是在整个程序的调用过程中,值不发生变化,称之为常量。 #### 恕我水平太低,度娘的话,没有完全理解,猜想大概的意思是:“小明的名字是不会变的,但是小明的值会变,会长胖,会长高,计算机所谓的变量,指的是小明这个人会发生变化。故小明是一个可以变的小明。 ### 四、 #### 跟变量相关的,还有:声明变量、变量赋值。 声明标量,就是指告诉电脑,我要给这个变量取个名字,他是啥类型,你得记住这个名字。 变量赋值:指的是给这变量一个值,然后让电脑记住,别搞忘了。如果不赋值,声明变量就没有意义了。 赋值的这个过程叫做定义变量。 #### 说了这么多,还是没说到正题,为啥编程中会有那么多数据格式? #### 先来个类比,为啥人有那么多属性? 或者说我们为什么要赋予一个人那么多属性? 因为,正是有了这么多属性,我们才能记得住这个人。比如,朋友让我找两个人去帮忙?我脑子里一篇空白,因为我脑子里认识的人多了去了,我哪知道找谁。你是要搬东西,还是洗衣服,还是做饭? #### 如果,朋友告诉我让我找两个1.8米的大个子搬东西,我立马就在脑海里,能搜出两个1.8米的人,这个就是属性。 可能这样理解会有些狭隘。 #### 为什么编程里会有这么多数据格式? #### 因为,数据格式是按着类别进行划分的,那么样做的目的可能是很大程度上是为了调用方便,调高运行效率。有了不同的数据格式,就把不同的变量做出区分....... #### 正是有了这么多数据类型,我们的大脑才能记得住那么多的人,记住这些人,靠的就是这些人有各种各样的属性,高、矮、胖、瘦、外向、内向......,我们人脑正是存储了这些属性,才能快速的调用他们,而不用每次的都重新认识他们。 #### 编程中也是这个道理。 我做了一个静态的网页,准确的说,是抄袭的....请原谅我.... https://yunfei1988.github.io/newtest-0814/ ================================================ FILE: homework/lesson2/wangzhongbin.md ================================================ ### 第二次课的总结 我的主页:https://wangzhong2014.github.io/javascript ## 本文为新生大学徐老师编程课的第二次课程总结。 老师在上课时,以小明为例,逐步推导了一个现实中的具体的小明,变成编程世界中的虚拟的小明的过程,随后进行代码的实际讲解。 文章分2部分: * 第一部分:思考-为什么编程中有那么多丰富的数据格式? * 第二部分:课程总结。 *有些理解可能有错,也有参考cloudyview童鞋的作业,赞^^* --- ## 编程中为什么会有丰富化的数据格式? ### 规范现实信息的复杂,方便记录和存储 老师课堂上的举例,让我想起上大学时一个刚学编程的同学,他装逼地说:我喜欢创造。虽然我觉得他说得是对的,但依然讨厌他。不过这一次课程,让我觉得,编程的确是在映射现实世界的一切信息。 语言和编程语言,一个对人说,一个对机器说,两者相似。而现实信息的复杂,客观上也需要具有多样化的数据格式,尤其电脑本质上只能识别2个东西:"0"和"1"。 这种识别限制,需要我们规范现实信息的复杂,先把所有信息一一对应,再把这些信息变成数据,才能够让电脑识别。 假如我们要描述“小明”这个人的信息,可以说: > 这个人叫小明,头发黄黄的,出生在1990,长有2只眼睛,2只手,他的家人有小王,小刘等一堆。 电脑不行,要先把信息一一对应,即“变量/值”:名字叫小明,头发是黄的,生日是1990,眼睛是2只…… 之后再是存储: 像姓名、家人等数据信息,用字符来进行存储很方便。 像如出生日期,身高,则需要用数值来存储比较好。 像有没有结婚之类的,需要用布尔值。 对于他的家人的数据,则需要一组数组来记录。 同时,如果要记录“小明”这个对象的所有数据,则是需要一个组合数据。 我们要描述的对象,具备的数据信息有不同的特征,通过对这些数据信息的分类和定义,从而让我们方便记录数据,定义对象。 ### 方便计算机处理 不同格式的数据,具有不同的特点,不同的处理需求。 字符的数据,只需要更换内容,比如把小明的名字改为“小王”。 数值的数据,需要进行加减,乘除。 而数组类,则会添加和删减元素。 通过规范数据格式,能更方便地处理数据,提升处理速度。 同时一些数据,为了方便处理,还会分化出更多的数据类型。 比如数值类,会有浮点数、实数之类的数值类型。 ## 课程总结 ### 一切从命名开始 所有的信息都是一一对应的: > 花是红的。 > 海是绿的。 > 我是XX。 在人语里,单纯地说一些黄色的、绿色的、高的、王某某,加1,完全没有意义的,无人能懂,也不会有人觉得你在和他说话。 在编程中,也是一样。 **没有不被对应的信息,也没有不被对应的数据,一切从命名开始。** 老师的这句话让我对编程的结构有一个新的认知。 程序员想要让电脑知道你在说什么,要干什么,需要先告诉电脑处理哪个对象,再进行数据的处理,学会命名也需要想办法。 ### 命名规则 命名如此重要,那么命名的规则也要了解一下,让别人读得明白。 * 一种是驼峰命名法,如:myName,第一个单词以小写字母开始;第二个单词的首字母大写或每一个单词的首字母都采用大写字母,例如:myFirstName、myLastName, * 下划线命名,如my_name,每一个单词之间,加一一个"_"。 (这种命名规则,我也觉得是为人来看的,方便之后的修改) 其次,还有就是,通常是用英语,而不是中文。 比如"myName",就不写"wodemingzi"或者"我的名字",估计是因为英文比较短,且代码是用英文写的,用单词比拼拼音更容易识别一些,且编程语言大都是外国人开发的…… ### 通过声明来关联变量与数据 既然编程,需要定义名称,然后再给数据,那么怎么做呢?流程是:声明-定义-赋值。 ``` var a = "112" ``` 这即是一个把变量和数据关联的例子。 先声明,后定义,再赋值。 虽然只是一行代码,但是严格来说是3个步骤。 首先是在声明:即"var",在声明要创建一个变量了。 定义a:是要给变量取名为a,且在电脑内存开辟一块内容,存储变量的空间。 赋值:让a = 112。 ``` //如果在终端nodejs或者浏览器环境中输入js代码: var a = "hello,word" //会得到: undefined //而如果只是输入: a = "啊啊啊" //则直接是得到 "啊啊啊" //不会得到undfined ``` undfined是指未定义内容。 为什么? 这属于电脑的默认回复。 我是认为,var a = "hello,world",这个是让电脑知道,我声明了一个变量a,然后定义a,开一个内存存储,然后把a赋值为 "hello,world",这里面并没有让电脑输出什么东西。故而,电脑就回复undefined。 ### 读代码 ``` var height = 170, weight = 130.1; ``` 可以同时声明2或多个变量。 ``` var locaitonBase = '北京'; var company = locaitonBase + '新生大学'; //字符串可以加减,然后company变成"北京新生大学"。 ``` ``` console.log('\n') // 空一行 ``` **并且编程里面只有英文,没有中文,因此符号最好是用单引号'',这样可以识别是否是英文输入法,且更容易打。** ## 程序的目的 程序存在的意义是什么? 帮我们做事情。 那么,程序是如何帮我们做事情? **处理数据,得出结果。** 也即,输入什么样的数据,程序给我们输出什么样的结果。 虽然看似,玩游戏,看视频,打电话什么的,都不是输入数据,得出结果。 但如果研究他们的源代码,都是这样的。 ================================================ FILE: homework/lesson2/wenliuxin.md ================================================ # 编程中为什么会有丰富化的数据格式? 现实世界有很多样化的数据,一个人自身就有不同的数据,比如代表他身体的数据——属性:身高、体重……;代表他社会关系的数据——关系:家庭、朋友…… 而这些数据又可以用各种方式去描述——文字、格式化、符号化、伪代码。 在编程中,要用上这数据就要给他们命名,命名的作用就是为了操作这些数据。比如,吃晚饭的时候,家人会喊:温刘欣,出来吃饭。 命名能把人和名字关联起来,关联名字和目标——就是名字和人之间的关系。温刘欣就是对应一堆数据(属性、关系……),这堆数据等于温刘欣。 在脑子中通过识别他人的属性等数据找到对应到的人,就是关联人和名字的过程。 由于程序的目的是处理数据得到结果,为了处理现实生活的各种数据,编程用也就有了丰富的数据格式,而数据包括:基本数据、集合数据(对象数据)、数组数据。 个人网页:https://liuxinaugustuwen.github.io/htmlTest/ ================================================ FILE: homework/lesson2/wenyunxin.md ================================================ # 第二节课程总结:编程中为什么会有丰富化的数据格式? ## JavaScript中的数据类型 * 数字:Number * 文本:String * 布尔:Boolean * Null * 数组:arry * 对象:Object ## 编程中为什么会有丰富化的数据格式? 计算机的运行是二进制机制。丰富化的数据格式能够有效地对不同的数据对象进行储存,每种不同的数据类型在计算机里都有自己不同的进制表现形式。对输入的对象进行数据类型归属判断,然后再进行二进制的处理转换,进而能够被计算机进行运算处理。 ## 问题: * 不同的数据类型在计算机里面处理的效率是不是不一样? ## 总结 进一步掌握github的协同操作,开始使用Sublime编辑器写文档、编代码,学会简单的markdown写作语法。 ## 个人主页地址 [温云新](https://wenyunxin.github.io/my_page/) ================================================ FILE: homework/lesson2/wufan.md ================================================ # 编程中丰富多样的变成数据 编程的目的是把世界转化成数据和算法在计算中运行处结果。 我们听的,看的,闻的,触碰到的,都是不同的数据。在计算机语言中也会有各种各样的数据。JS中的数据分为,number,string,boolean,object,array五大类,前面三大类实际就涵盖了描述世界的基本数据。这就好比上建房子需要的砖和瓦,但是仅仅有这些是不够。对象就是两种以上的基本数据类型组成的一个数据结构,对象数组是一个更大的数据结构。 # 剖析本节课中的sample代码 var name = 'xiaoming';//声明变量,定义变量类型为字符串string; var age = 18;//声明变量,定义变量类型为数字number; var height = 170, weight = 130.1;//声明变量,定义变量类型为数字number; var isMan = true;//声明变量,定义变量类型为布尔值boolean; var student = false;//声明变量,定义变量类型为布尔值boolean; var xinshengUserName = 'xiaoming';//声明变量,定义变量类型为字符串string; var wechat_user_name = 'xiaoming';//声明变量,定义变量类型为字符串string; var locaitonBase = '北京';//声明变量,定义变量类型为字符串string; var company = locaitonBase + '新生大学';//声明变量,定义变量类型为字符串string;字符串赋值直接连接在一起,不像数字类型赋值可以相加 var myLikeColorsList = ['blue', 'green', 'black', 'write'];//声明变量,定义变量类型为数组array和字符串string的数据结构; var myLikeFoods = ['刀削面', '拉面', '牛肉面', '杂酱面', '麻辣面', '烩面', '莜面'];//声明变量,定义变量类型为数组array和string的数据结构; var myJavaScriptLessionInfoObj = { teacher: name, teacherWeChat: wechat_user_name, title: 'JavaScript编程入门', beginTime: '2018/8/8', endTime: '2018/9/4', boysStudent: 417, girlsStudent: 119, lessionTarget: '帮助更多小白学习JavaScript', githubUrl: '[https://github.com/xugy0926/getting-started-with-javascript'](https://github.com/xugy0926/getting-started-with-javascript') };//典型的对象数据结构,内含多种数据类型,string,number 属性和方法函数的使用 如:myLikeColorsList.length中的.后面带的就是变量的一个属性, 能够调用这个属性的函数就是方法函数。 数组游标就是标记处数组某一个元素的值 如console.log(myLikeColorsList[2]);注意游标是从0开始计算第一个元素的,这里实际上是第三个元素。 for循环for (var i = 0; i < myLikeFoods.length; i++) { console.log(myLikeFoods[i]); }//(起始语句,条件语句,执行语句)括起来的就是执行每一个数组内元素的命令。 \n是换行标识。 // 用上面定义的变量重新打包,并定义出xiaoming这边变量 var xiaoming = { name: name, config: { ​ age: age, ​ height: height, ​ weight: weight, ​ isMan: isMan, ​ student: student }, like: { ​ myLikeColorsList: myLikeColorsList, ​ myLikeFoods: myLikeColorsList }, work: { ​ locaitonBase: locaitonBase, ​ company: company }, myJavaScriptLessionInfoObj: myJavaScriptLessionInfoObj } console.log(xiaoming);//这里就是把之前的所有函数调用进来形成了一个嵌套,nested,读起来方便。 # 我的静态网页 虽然比较简陋,后期我会逐步把自己学习遇到的坑记录下来 https://french5.github.io/test/ ================================================ FILE: homework/lesson2/wukuipin.md ================================================ #### 多样化的数据格式(数字、文本、布尔、对象、数组) >每一个目标对象都有很多个数据,要描述和控制这个目标之前,要先定义变量,用于收集这个目标的数据或控制目标时找到控制目标的控制器。多样化的数据格式能更好地描述或指定一个目标。我们编程的目的就是,“处理数据,输出结果”。 >一组数据,没有指定的目标,没有用来描述具体的对象,这样的数据是没有任何意义的。所以,一切从命名开始! #### 有个问题,JavaScript对象是用Hash结构存储的么? >我发现JavaScript对象和Hash表的数据结构非常相似。于是Google一下,找到一篇文章,作者根据运行效率论证JavaScript对象是以Hash结构存储的(不过有些地方没看懂)。 文章地址:https://lz5z.com/JavaScript-Object-Hash/ Antarts个人静态网页:https://antarts.github.io/Study_Note/ ================================================ FILE: homework/lesson2/xianengqi.md ================================================ +# 编程中为什么会有丰富化的数据格式? +因为丰富化的数据格式易于区分和读取。 +## 第二节课里重点是 +**一切以命名开始,好的命名更易于他人读取** *** +在编程中不断的要问自己,这行代码为什么能在这里运行,能否用这行代码运用到其他层面上去,是否这串代码对我们真的有价值? +### 这位同学解释的挺好的,以下我引用了同时也更改了一部分~ >代码不重要,解决问题的方法更重要。 任何时候都不能忘记'思想'是前提,你要知道你为什么做这件事?这件事的本质是什么?(要运用"第一性原理思考"吗,可以试试)为什么学这个东西?(因为有需求和目标,所以就有内在动力),有没有更好的方法去做?(大道至简,不变的永远是真理,任何事物都有他的道理,老师教的是内功心法,我们同时也要把马步扎好,基本功不扎实,别人一个扫堂腿,那就是有辱师门啊。嘻嘻) +### 遇到的问题有哪些? +问题很多,问不出来,我先自己摸索哈, [静态页面链接](https://xianengqi.github.io/test/) >链接我照打了"一淼"同学的代码,做出来的,哈哈。 ================================================ FILE: homework/lesson2/xiongliyu.md ================================================ # 第二节课总结 ## 编程中为什么会有丰富化的数据格式 ### 变量名与值 >通过变量名直接访问,变量名背后的数据 ```markdown var locaitonBase = '北京'; var company = locaitonBase + '新生大学'; console.log('公司: ' + company); ``` 有了这种方式我们就可以通过调用company来掉调用它背后的值(数据)和背后的背后的值(数据)。这样做的效率会更加的高,使用起来更加的便捷。 ### 变量名和数据(值)是两口子 >如果没有把数据打包成变量名: >如老师代码中的例子:console.log('我总共喜欢 ' + myLikeColorsList.length + ' 种颜色');那我们就只能这样写:> console.log('我总共喜欢 ' + ['blue', 'green', 'black', 'white'] + ' 种颜色');我们就无法很顺畅的表达我们的意思。数据量一大,就根本无法操作了。 ### 编程中为什么丰富化的数据格式 >从定义变量并赋值到把数据打包,又在循环语句中使用打包的数据,在到后面把一堆数据用对象的格式书写并赋值给一个变量。老师一直都在用不同的数据格式在打包数据 ### 程序的目的是什么 > **处理数据,给出结果。** 虽然我现在还不能很好地理解这句话,和这话背后的编程思想,但是我会先记住,我相信以后会有更好的理解。 但是我发现有了 数据+编程语法,感觉代码就“活了”,有了数据,使用编程语法(调用内置库),就可以写函数,循环语句,或是把数据打包到对应的数据类型中,在调用...等等。 回想到老师第一节课说的:掌握编程语言,用编程的方式调用服务来完成我的需求。掌握了编程语言可以更灵活的处理数据,得出更好的结果。 问题:徐老师请问一下,我应该如何找到课程的PPT呢? 我回过去看微信群消息,可能粗心没找到 是不是用git 查看隐藏文件?但是我git init还是看不到 谢谢老师,我要继续补完课 附加作业(我想等到第五节课作业补完了再做CSS,没有修改):https://xiaoxionglovetang.github.io/test/ ================================================ FILE: homework/lesson2/xugaoyang.md ================================================ 昨天我帮你们梳理了变量和值之间的关系。下面梳理一些知识点供大家参考,好好利用周末的时间把这块啃下来。 1. 多样化的数据格式(数字、文本、布尔、对象、数组) 2. 多样化的数据格式的操作方式。 以上内容网上有很多教程,如果你想买书,我推荐“JavaScript权威指南—淘宝前端团队翻译的那本” 【作业要求】 1. 熟读getting-started-with-javascript/study/lesson2/smaple_code.js代码。用node环境和浏览器环境运行一下代码(注意:浏览器运行请使用my_personal_info_page.html) 2. 写一遍课程总结,题目为:编程中为什么会有丰富化的数据格式? 3. 如果有问题,在总结中把你的问题罗列出来,我会做解答。 【附加作业要求】 1. 在github上部署自己的静态网页,把网页地址放在总结文档里。 【提交方式】 1. 请向getting-started-with-javascript项目发起pull request。 https://github.com/xugy0926/getting-started-with-javascript 2. 文档格式,markdown。 3. 提交homework/lesson2目录下。 ================================================ FILE: homework/lesson2/xuli.md ================================================ # Lesson 2上课心得-许丽 (20170902) 看着同学们的进度,自己甚是焦虑,但也告诉自己,还是不能放弃,有这么多人帮着我,我更不能放弃。 过了这么久,重新翻看老师的ppt,看着当时的学习笔记,以及第一版没有勇气交的作业,于是重新做了下梳理。 ## 老师上课知识的消化 ### 与名字相关知识 老师先是一切从命名开始讲起,似乎这对我而言感觉特别贴切。 我家小宝宝马上就要出生了,虽然最终的大名还没有完全确认,但是乳名却是早早地想好了。 所以,对于老师说的,用名字来操纵人,我算是秒懂了。 正是因为我们想好了宝宝的乳名,即便ta还未出生,但是这一点没有妨碍我们做胎教,与ta交流...... 对于老师说的:“取名-生小孩-吧名字和小孩关联上 ” 理解起来也是特别顺其自然~ 老师又用几张照片,启发我们思考“我们是如何识别人的”,这里让我更清楚地了解了,其实本质上还是调用大脑对信息数据的处理,从而类比联系到计算机对数据的处理。从而将名字与目标关联起来了。 ### 用多样化方式来描述数据 老师前后通过多种形式来对“小明”这个人进行描述,分别有:大段的文字、整理整齐的格式化方式、符号化方式和伪代码方式。 循序渐进地,让我们看到了每一次的变化,更让我们感觉到怎么样更加一目了然。 最后,所谓“伪代码方式”,特别完美地实现了向程序语言的过渡,当上课到那一段的时候,瞬间我感觉原来编程语言这么友好,我竟然能够看得到,瞬间觉得英文代码的世界好美呀~ 😄 ### 变量先声明后定义 老师通过让我们用行话翻译: `var output;` `output = "Hello, JS";` 告诉我们最标准的翻译是:声明变量,变量名叫output,定义这个变量,给这个变量赋值为‘hello,JS’ 又瞬间觉得我们可高大上了,如此小白可以这么标准地翻译成行话,同时告诉我们只有声明了、定义了,才能使用。 不过我是在后面查看可见内容才注意到老师的文字内容—— 声明:是在声明要创建一个变量;定义:是给这个变量开辟一块内容,最后才是赋值。 ### 多样化的数据格式(基本数据&组合数据) 似乎听完课后我忘记了这一块的内容,重新查看老师ppt的内容,好像可以通过对“小明”的基本信息进行分类理解。 基本数据包括一些单一的数值、信息等;而组合数据包括:集合数据、对象数据、数组数据等等 ### 阅读一大块代码 高阳老师在课程上给我们进行实操,告诉我们一些命名技巧,从而也像我们展现了命名的重要性。 作为小白的我,只是感觉这些内容上课的时候似乎我都能听得懂,看着这些大块代码,好像没有那么恐怖,反倒觉得还满美妙的,也许这就是js的魅力吧。 ## 写在后边 认真地写总结还是有蛮大的收获的,但是看到同学们的作业,会瞬间觉得自己的差距还真是有点大。 总结需要继续写,似乎更重要的是需要自己去敲敲代码,真实地感受编程的世界。 我想自己不能再偷懒啦,继续赶进度吧~ ================================================ FILE: homework/lesson2/xuluchun.md ================================================ # 第二课总结 ## sample_code.js代码剖析 + 在预览中能够显示的是console.log()里面的内容,而定义变量var不能显示。 + 可以看出" "和' '都是可以应用于字符串【console.log("年龄: " + age);】 + 单引号里面可以是符号,里面是什么就可以显示什么。变量名不使用引号。 + 数据类型这几种 依复杂程度:布尔值《数值《字符串《数组《散列。使用散列的数据形式可以对数据进行整理打包,此时的散列形式的变量因为含有系统性的数据可以理解为对象。这种方式被称为**语法糖** + `config: { age, height, weight, isMan, student, bloodType: 'A', haveGirlFriend: true }` 和 ` config: { age: age, height: height, weight: weight, isMan: isMan, student: student } `两种写法均能够正常显示,说明前者写法是后者的简写(当对象里的变量命名和赋值过来的变量名字一样时,可以简写)。 + console.log()中可以=使用变量。 ## 求知 使用过atom编辑器,当检测到代码问题的时候回显示红色作为提示,而vs code却没有该功能,是需要设置吗? ## 编程中为什么会有丰富化的数据格式? >有这样的一句话“存在就是合理的,合理的才会存在”。那么存在这么多数据的数据格式必有其原因。 >反着推理,假设没有这么丰富的数据形式,比如只有字符串,那么要让计算机做计算的时候怎么办,根本无法实现。假设没有散列像sample_code.js中就无法把数据整理成一个有机的数据体来操作对象。 >数据形式越丰富,就相当于工具或者组件越多,从而实现某种功能的方法就更多,更加有效率。同时因为数据是存在于内存中,所有也考虑了怎样的数据形式能被电脑所储存。 ================================================ FILE: homework/lesson2/xumin.md ================================================ # 编程中为什么会有丰富化的数据格式? > 熟读代码:[https://github.com/xuminsmile/getting-started-with-javascript/blob/master/study/lesson2/sample_code.js] > > Tip: 如何在终端快速打开当前文件夹图形界面 > > // mac终端快速打开getting-started-with-javascript > > \> cd getting-started-with-javascript > > // 注意open后面是空格,然后是一个英文的点号. > > \> open . > > Tip:查看当前的全路径 > Mac终端输入pwd指令可以查看当前的全路径,依据这个全路径再通过finder找到文件夹。 ## 程序的目的是什么? 为了处理数据,得到结果。 ## 数据类型是什么? JS中的数据类型包括:原始类型和对象类型。 ### 原始类型 包括:数字、字符串、布尔值、null(空)、undefined(未定义)。 ### 对象类型 包括:”命名值“的无序集合、数组、函数。 ## 为什么会有丰富化的数据格式? 数据格式:数据保存在文件或记录中的编排格式。可为数值、字符或二进制数等形式。由数据类型及数据长度来描述。 存储占用硬盘空间,传输占用带宽流量,计算占用内存空间;不同变量类型所需提供的字节大小是有差异的。 既要满足需求,又要实现效率最大化,不同的变量类型,是为了实现存储、传输、计算的效率最大化,于是发展出丰富化的数据格式。 ## 本课知识点:对变量的使用 1. 声明:声明要创建一个变量。 2. 定义:给这个变量开辟一块内容。直接用var+空格+变量名称;即可。 3. 赋值:最后赋值。 JS中,声明一个变量,然后赋值变量。 ================================================ FILE: homework/lesson2/yammy.md ================================================ ## 为什么编程语言需要多样化的数据格式? ~~以下是我的个人理解:~~ ~~一般来说,编程的目的就是:**处理数据,得到结果**,我们想要得到一个期望的结果,其中必然需要处理数据,甚至可能需要处理不同的数据,处理海量的数据。~~ ~~拿小明这位同学举个栗子,从小明身上,根据属性的不同,我们可以找到不同的数据,比如姓名、身高、年龄、五官、家人情况、家庭住址、学校情况、学校地址。。。把这些所有的属性归纳在一起,就等价于小明这位小盆友。~~ ~~如果小明有这些属性,那么换个人是否也有同样的属性呢?~~ ~~哦,原来小花、小塔都有一些相同的属性:姓名、身高、年龄、家庭情况、学校情况。。~~ ~~那么我们是否可以考虑把这些属性抽象出来,作为所有人的共同属性呢?~~ ~~回到编程语言,小明、小花、小塔就是我们编程中所说的对象,所有的对象都有共同的属性,这些属性抽象出来可能就是:字符串、数字、布尔值、数组和字典。~~ ~~回到问题本身,编程语言之所以需要多样化的数据格式,就是要尽可能准确的存储对象的属性值,确保这些属性值拼接在一起可以等价于对象本身。~~ **20170817 更新:** 1. 根据所要描述的对象的不同,使用合适的数据类型 我们想要描述的对象,有时候千差万别,为了尽可能准确的描述它们,所以我们需要多样化的数据格式。 编程的本质就是:**处理数据,得到结果**,以 JS 举例,其常用的数据类型有:string、number、boolean、null、undefined、function、array和 object等,不同的数据类型处理的难度不同,为了尽可能的让数据处理的更快,我们需要选择最合适的数据类型。 比如,如果我们只需要处理一个人的年龄数据,我们可以定义一个对象: ``` var xiaohua_info = { age: 20; } ``` 得到小花的年龄的方式是调用对象的 name 属性:`console.log(xiaohua_info.name);` 当然,我们也可以直接定义一个 number: `var xiaohua_age = 20` 那么,得到小花的年龄的方式就相对简单:`console.log(xiaohua_age);` 很明显,在这里后者是更加适合的方式。 2. 不同的数据类型,决定了代码被机器执行的效率 不同的数据类型,其占用的计算机内存是不一样的,为了尽可能的利用计算机的存储资源以及提高计算机执行代码的效率(效率主要反应在存储效率、计算效率和传递效率上),我们需要选择合适的数据类型。 另外,不同的数据类型,会告诉编译器或解释器,我们该如何使用这个数据。 ## my page [my-page](https://yammmy.github.io/my-page/) ================================================ FILE: homework/lesson2/yangtieming.md ================================================ # 编程中为什么会有丰富化的数据格式? >"数据是放在内存中的,变量是给这块内存起的名字,有了变量就可以找到并使用这份数据。但问题是,该如何使用呢?"——网络某人 我觉得网上找的的这句话似乎帮我更清晰的认识了**数据**、**内存**、**变量**三者之间的关系。 + 内存,应该就是数据存储器。1kb的内存=1024个字节。我们把这1024个字节看成是从上往下的1024个格子。 + 我们先申明一个变量,就是给将要进行存储的这块内存(1个或几个格子)进行命名。所以**一切以命名开始!** + 我们再定义这个变量,就是告诉计算机,我存进去的是什么,这个东西有多大。是整数,字符串,图片,音频还是别的什么?这就是**数据类型**。 ### 那么为什么要对数据进行分类? 1. **便于计算机存储和读取**。 因为每种类型的数据所占用的内存空间(格子数)是不同的,分类后便于计算机快速存储和读取。 比如:int 表示整数,在存储时占用4个字节(4个格子) char 表示字符,在存储时占用1个字节(1个格子) 如果计算机一个一个格子的去存储和读取数据,再去判断它是什么就显得效率低了。 2. **便于计算机对数据进行使用**。 如果计算机读取的数据是int 整数,它就知道这个数据是要进行数学计算的。 如果计算机读取的数据是string 字符串,它就知道这个数据是用来显示出来的。 以上是我对数据格式的理解,请老师指正! ================================================ FILE: homework/lesson2/yangxuewu.md ================================================ # 编程中为什么会有丰富化的数据格式? ## 1. 什么是数据格式 无论哪一种编程语言,都要用不同的标识来定义数字、字符串、真假值、集合等等,这些标识就是不同类型的数据格式。在很多其他的类型的编程语言中,会用`int` 表示整型数值(1,11,111,等整数),用 `float` 表示浮点型数值(1.01,11.001,等小数),用 `string` 表示字符串("我是字符串"这样的放在引号里的文字),用 `bool` 表示布尔值(true,false真假值),等等。而在 JavaScript 语言里就简单的多,无论什么数据格式,都用一个 `var` 来表示,数据类型也变得简单的,整数、小数都是数字型,字符、字符串都是字符串,再加上布尔型,就构成了 JavaScript 的数据类型。由这些数据类型再构成复杂的 **对象** 和 **数组** 数据,定义方法也是 `var` 。 ## 2. 为什么要有这么多的数据格式 在课程的示例里,有这样两个操作 1. ​ ```javascript var a = 1; var b = 2; var c = a + b; console.log(c); ``` 得到的结果是 **3** 。 2. ​ ```javascript var name = 'xiaoming'; var sex = 'male'; var stringAdd = name + sex; console.log(stringAdd); ``` 得到的结果是 **xiaomingmale** 。 为什么会有这样的结果呢? 如果再来这样一个例子 3. ​ ```javascript var name = 'xiaoming'; var age = '18'; var s = name + age; console.log(s); ``` 结果会是什么呢?结果是 **xiaoming18** 为什么第一个例子里的结果是把 1 和 2 做了算数的加法运算,得到结果 3 ,第二个和第三个例子是把 'xiaoming' 和 'male' 拼接在了一起,这就是数据格式的作用。 我们在编程的时候定义不同的数据格式,就是为了告诉计算机,它要处理的是哪一种数据,只有计算机知道了要处理的是哪一种数据格式,它才会调用用于这种数据处理的方法,是要把两个数据做算数运算,还是进行字符串处理。 所以,定义丰富的数据格式,就是为了让计算机能够理解我们所编写的代码,正确处理我们的代码,得到正确的结果。 ## 3. 我的个人页面 页面有些简陋,会不断的添砖加瓦,让它更好看。[我的个人主页](https://simsalyang.github.io/jsBlog/) ================================================ FILE: homework/lesson2/yangyepeng.md ================================================ ## 编程中为什么会有丰富化的数据格式? 首先,对于编程来说,不管是哪一种语言,都逃不开一个话题,就是数据类型。 一般都会有这些数据类型:整形,浮点型,布尔类型,字符串类型,数组类型和对象类型等。 ### 那么为什么需要区分不同的数据类型呢? 简单的理解应该是为了对信息进行分门别类,方便计算机进行运算处理。 另外一层理解,应该也是为了方便编写和读取程序的人对程序语言的理解,特别到了面向对象的语言,是以更接近人脑的思考方式抽象出计算机的语言。 #### 对应到生活中的例子 - 有时候我们会做一些数字的计算,比如,1 + 2;当然也不一定都是整数,所以也会有涉及到小数点:1.5 + 2.5;这就是所谓的整形和浮点型。 - 当然,我们不可能一直用数字来描述事物,比如你的名字,正常情况下是中文或者英文,我们可以理解为一串字符。这就是所谓的字符串。 - 我们也会遇到类似的情景,比如,某某机构要求你填写个登记表。这时候表上面通常会有你的个人信息;比如姓名,生日,出生地点,年龄,性别等等。这个就可以理解为对象数据。填写的信息通常就是跟登记人相关的属性,可以用来判断是不是你这个人的一些信息。 #### 听完第三节课之后,有了更深的理解 老师在第三节课提到,不同的数据类型,占用的内存是不一样的,计算机在存储和读取不同类型的数据也是有些不同的。 那么用什么样的数据需要进行考究了,因为它会影响计算机的运行效率,也就是你程序的运行效率。 #### 我想着两点原因应该就是为什么需要丰富化的数据格式了吧,如果理解有误还请老师指正! ================================================ FILE: homework/lesson2/yanqingmu.md ================================================ # 编程中为什么会有丰富化的数据格式? *我的世界*:https://yanqingmu.github.io/my-world/ 总的来说,相比我们人类的高级语言,编程也是一种语言,虽然它里面也包含了很多方言:C、C++、Python、Ruby,以及我们的JS等等。不同的方言在各自的领域大行其道。 那么作为语言,为了达到顺畅交流的目的,它的内容就必须丰富起来,数据格式的丰富化应该只是其表征之一。 既然都是语言,那么编程里的数据的格式,可以类比为我们语言中的名词、动词、形容词之类的。名词用来指代事物,动词表示行为,形容词用来描叙。不同的格式有其不同的应用场景和功能。 比如说,整数类型的数据可以用来计算和排序;布尔类型的数据可以用来做判断;而数组类型的数据就可以用来做批量的数据处理。 虽然在JS里我们并不需要定义出变量的类型,但是这并不表示说在JS中不需要考虑数据类型,相反的这里更需要我们对数据的类型和格式有充分的了解。否则就很容易出错。 比如以下的代码: ```console.log('身高 = ' + height + ', 体重 = ' + weight);``` 可不可以写成 ```console.log('身高 = ' + 170 + ', 体重 = ' + 130);``` 又可以不可以写成: ```console.log('身高 = ' + '170' + ', 体重 = ' + '130’);``` 它们的区别又是什么呢? 虽然它们的输出相同,但是含义却不同。以 ```height = 170``` 为例,前两者的区别是,如果代码了中有很多条都用到了「170」这个数字,那么当我要调整这个数,如「170」改为「130」时,定义了height的程序可以直接改height的赋值就可以了,而没有定义的程序就只能一个个改「170」。 而最后一句是把「170」这个数直接变成了字符,虽然输出形式一样,但是这个「170」已经不能想原来的整数一样做运算了。 ================================================ FILE: homework/lesson2/yimiao.md ================================================ ### 第二课课程总结:编程中为什么会有丰富化的数据格式?815 #### 收获 1. 熟悉了git的用法,之前也学过ruby,但是不是很清楚,但是发现老师这种教学方式很容易就理解了。 2. 类比的方式很容易让我理解抽象的概念,用熟悉的事物来理解抽象。 3. var output ; output = "xx" 了解数据与变量的关系,如何关联 先声明,再定义 4. 如何在网页上运行javascript代码:通过 console;在网页的source里有snippets可以新建一个文件比如am.js 5. 在不同的环境里(浏览器环境和node环境),有一些命令是有差异性的比如alert只有在浏览器才有。 6. 同步更新fork项目的步骤: cd——git remote add upstream xxx——git checkout master--git fetch upstream--git merge upstream/master--git push origin master --- #### 关于代码部分 > var age = 18, weight = 130; 平行排列 - 四种命名方式 why? not know yet - 数组类型 - 对象变量:= { title:**注意不是等号** } - 输出 - console.log('\n')试出来的结果可能是空行 - 对象数组非常重要 #### 编程中为什么会有丰富化的数据格式? 我觉得因为数据的类型非常多,数据格式多则可以操纵的数据就多。 他们组合的类型也更多。 ================================================ FILE: homework/lesson2/yongfei.md ================================================ ## 编程中为什么会有丰富化的数据格式 * 编程中有大量的数据变量,一切以命名开始,先声明变量,再定义变量,给变量赋值。 * 多样化的数据格式包括:数字、文本、布尔、对象、数组... * 有了这些丰富的数据格式,我们就能更清楚的定义变量,可以让变量做更多的事,而且这些数据格式也足够简单明了,易于理解。 ### [我的网页](https://fenglaishuzhu.github.io/jslesson2/) ================================================ FILE: homework/lesson2/youshilei.md ================================================ # 第二课作业 编程中为什么会有丰富化的数据格式? ## 一、JS数据格式有哪些 js中有六种数据类型,包括五种基本数据类型(Number,String,Boolean,Null,Undefined),和一种混合数据类型(Object)。 ## 二、丰富化的数据格式的理解 丰富的数据格式主要有以下特点: - 不同的数据类型占用不同的存储空间。通过把数据归类,可以节省存储空间。 - 将不同的数据类型进行归类,可以提升计算效率。 - 数据格式的丰富多样可以对应不同的事件类型,处理不同的生活场景。 ## 三、我制作的静态网页 [我的静态网页](https://yousl.github.io/mypage/) ================================================ FILE: homework/lesson2/yueruiqi.md ================================================ # 作业2 JS课程2总结 --- 编程中为什么会有丰富化的数据格式? **数据** 程序就是输入数据,处理数据,得到结果的过程。 为了便于处理数据,就需要把数据分类,这样就有了不同的数据格式,同时运用特定的数据格式时,对比混合使用数据,函数运算也可以相应简化,节省系统资源。 **静态网页** - https://yoricci.github.io/YRQ-Static-Web/ ================================================ FILE: homework/lesson2/yujianke.md ================================================ 1: https://choudac.github.io/hi/ 2: 数据格式是程序设计语言封装好的对象,以便调用。 ================================================ FILE: homework/lesson2/zhanggaoyang.md ================================================ # 第二课总结 ## 编程中为什么会有丰富化的数据格式 ## --- 通过第一课改进银行开户流程的案例可以了解到,编程就是通过不断改进,不断完善,以达到更高效率的运转。所以,编程中为什么会有丰富化的数据格式?我的推测是————可能是因为在敲代码的时候遇到了很多的问题,通过进一步改进,出现了丰富的数据格式,以便达到更好的使用效果,提高效率。 ---------- ## 课程总结 ## 明天犀牛书才到,所以对于那些基本概念还不太清楚,这几天通过网上的教程视频等了解了一些。对于概念性知识点的讲解果然是比较枯燥,网上的那些人又没有老师讲的好。所以,对于那些为什么这里用单引号,那里不用,为什么这里大小写都有那里没有等等这些基础性的问题,我会在书中找到答案。不过网上的视频虽然效果不好,我也是了解到一些基础知识,但我非常清楚老师一直在教我们的并不是基础知识,这些东西靠自学就可以掌握, 老师真正要教给我们的是————编程思想。 通过这两节课的学习,我了解到以下几个编程思想。 1.定义 关于小明那里是先生小孩再取名,还是先取名再生小孩的问题。编程的思想就是先定义,有了准确的定义才能得出相应的值。 2.对比和试错 在熟读代码的过程中经常会出现这里为什么用这样的符号,那里为什么用那样的符号,如果遇到不明白的就尝试一下,通过对比得出的结果大概能猜到一二。 3.类比 这两节课最明显,印象最深的就是老师通过类比帮助我们更好的理解复杂的知识体系。 [静态网站][1] [1]: https://zhanggaoyanggordon.github.io/zhanggaoyang/%E2%80%9C%E5%8F%AA%E4%BC%9A%E6%94%B9%E4%B8%AA%E5%90%8D%E5%AD%97%E3%80%82%E3%80%82%E3%80%82%E2%80%9D 网站只会改标题... 最后的话,其实这些作业早就做完了,之后一直在思考课程,可能是我还不了解这个代码,思考了两天也没想出什么来,总结也就这样了,赶在开课前交上作业~ ================================================ FILE: homework/lesson2/zhanglina.md ================================================ ##我的第二次作业 ### 《迟来的作业》 ### 今天我打算,不写上课学到的东西,写点学习之外的东西,但是还是要对于第二节课程的问题做一个 ### 简单的回顾。 ### 开篇老师讲了小明的信息,将小明的信息抽象为一些描述,总结而已:就是可描述小明特征的一些属性关系。引申出来了变量的定义,以及用json格式来定义一个人的信息。课程的最后,老师带着我们看了一些js的代码样例sample.js,课程完结后:老师留了作业。 ###关于第二次的作业:搭建一个个人主页。如果完全按照老师的教的方法,copy一个,其实对于我而言 ###,或者说是对于大家而言,都是挺简单的。但是如果只是停留在完全和老师一样,没有任何改变,瞬间 ###也觉得没有那么有意思了。于是我开始想,怎么把我的主页设置的漂亮一些,添加上我想添加的元素。 ###但是折腾了好久,并没有达到预想的效果。特别是在HTML的布局这块卡住了。浪费了好久,没有出结 ###果的情况,实际是我最不能接受的,因为还有其余的事情要做,时间这个事情,真的是伤不起啊。于是 ###我在想,我这巨丑无比的网页,我要不要交这次作业,真的ppt做出来的效果比我这高大上不知道几百 ###倍。越想其实会越没劲的。但是当看到群里的小伙伴们,即使不好,即使不会大家还是努力的做,老师 ###在竭尽全力教大家,我又有什么理由,因为做的不好就不做了呢,做的差就不交作业了呢。 ### 作业还是按时提交,看着开始笨戳的自己一步步成长。 ###[我的个人首页地址:https://zhanglinalove.github.io/test2/index.html](https://zhanglinalove.github.io/test2/index.html) ================================================ FILE: homework/lesson2/zhangqian.md ================================================ ## 编程中为什么会有丰富化的数据格式? ### 用名字来操纵人 先要赋予一个人名,用这个人名去执行一系列行为。 ### 人的属性 同样都是人,为什么我妈妈不是你的妈妈,你是你妈妈的孩子而我不是。这是因为人与人的属性不同。 换言之,编程世界里,需要我们去创造一个“人”,给它取一个”姓名“-变量,给”姓名“-变量设定一些”属性“-值。 例: var output = "hello, js" var output ; output = "hello,js" ; - 先声明 - 在定义 - 赋值 >数据格式是数据保存在文件或记录中的编排格式。数据类型是与程序中出现的变量相联系的数据形式。 >常用的数据类型可分为两大类。 >①简单类型:整数类型、实数类型、布尔类型、字符类型和指针类型。 >②复合类型:数组类型、记录类型、集合类型、文件类型。 丰富的数据格式是为了清楚的定义变量,更准确的得到数据输出结果。 [静态网页](https://zhang-qian.github.io/jingtaiwangye/) ================================================ FILE: homework/lesson2/zhangxuedong.md ================================================ # JS第二课总结 静态网页:https://xuedongz.github.io/test/ ## 编程中为什么会有丰富化的数据格式? 首先,数据类型有:数字、字符串、布尔值、null、undefind以及对象 > 特殊的对象有全局对象、函数 然后编程是对自然世界的描述。在自然界每个对应物都有一连串的属性来描述他。比如小明,用{身高、体重、年龄、关系、血型、DNA...}等穷尽一系列属性就可以等价于小明这个人。不同类型的属性在编程中就得用不同的数据类型来表达。比如身高-->数字;婚姻-->true/false;曾经毕业院校-->数组... ## 多样化的数据格式的操作方式 取名(给出变量),并赋予属性/值,然后通过运算符对变量进行操作。计算机不能直接引用值,只能通过其赋值的变量名称来获得对值的引用 > “在编程语言中,能够表示并操作的值的类型称做数据类型(type),编程语言最基本的特性就是能够支持多种数据类型。当程序需要将值保存起来以备将来使用时,便将其赋值给(将值“保存”到)一个变量(variable)。变量是一个值的符号名称,可以通过名称来获得对值的引用。” 摘录来自: (美)David Flanagan. “JavaScript权威指南(原书第6版)”。 iBooks. ## 变量命名的三种方式 1.匈牙利命名法 > 变量名 = 类型 + 对象描述 2.驼峰式命名法 变量名或函数名是由一个或多个单词连结在一起,其中第一个单词以小写字母开始,后面的所有单词的首字母都采用大写字母,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。 3.帕斯卡命名法 和驼峰式命名法类似,只不过第一个单词的首字母需要大写。 *** 参考文档: > http://zhuyujia.github.io/specification/javascript-variable-naming-rule.html ================================================ FILE: homework/lesson2/zhaokaili.md ================================================ # 编程中为什么会有丰富化的数据格式? ## 什么是数据格式? 搜狗百科: >数据格式(data format)是数据保存在文件或记录中的编排格式。可为数值、字符或 二进制数等形式。由>数据类型及数据长度来描述。其确定应满足一定条件:①保证记录所需要的全部信息;②提高存贮效率,保证存贮空间的充分利用;③格式标准化,保证有关数据处理系统间数据的交换。根据 数据记录长度的特点,一般分为定长格式和变长格式。前者文件中记录具有相同的长度,后者长度由记录值长短确定。 ## 为什么要有多种数据格式? 我觉得既然数据格式是由数据类型和数据长度来描述,那么就可以从这两个角度来分析。 ### 为什么要有不同的数据长度 个人理解数据长度也是我们在声明变量的时候要在内存上开辟的空间的大小,因为早期的计算机性能偏低,为了提高计算机的运行效率,需要对计算机的内存进行精打细算,所以要根据实际情况来选择合适的数据长度进行存储数据,避免过多的占用内存空间。 ### 为什么要有不同的数据类型? 因为现在都是面向对象开发,所以我觉得不同的数据类型可能是为了描述不同的对象方便吧。 编程中,我们要描述各种各样现实生活中的对象,比如音频,文字,视频等,他们本身是多姿多彩的,所以我们在编程中也要开发多种数据类型,用来更好描述现实生活中不同的对象。 # 我的静态网页链接 [https://luckary.github.io/test/](https://luckary.github.io/test/) ================================================ FILE: homework/lesson2/zhaoxiaoxin.md ================================================ 编程中为什么会有丰富的数据格式? 一个事物繁荣兴盛的标志,就是它的多样化,也就是说有很多分类。 为什么编程会有丰富的数据格式?因为编程需要调用的数据太多了。 在计算机的世界里,各种信息都是用一系列二进制的数来保存的。电脑能保存的数据特别多,可以看做是数据的汪洋大海。 面对这么多的数据,如何有效保存,如何方便存储和读取? 分类是个好办法。 1、分类可以让我们只关注同一类的共性与不同类之间的差异,而不必关注每一个具体的数据 JS中,数据划分为六类,numbers,strings,boolean,object,function,undefined values。 数据分类后,我们只需要关注我们需要用到的数据是哪种类型,应该如何使用。电脑只需要判断目前处理的数据是什么类型,应该怎么储存。 2、分类,相当于把相同的事情统一处理,标准化、程序化,从而提升效率。 数字类型的数据,应该如何存储,如何计算,计算机对此作出了规定,以后遇到数字类型的数据,都可以用这种规定来处理,不必新编程序,不必对每个数据都思考怎么处理。所以可以加快进程。 李笑来老师说,编程的世界,有许多优秀前沿科学的思想。面对要很多要处理的事情时,对事情进行分类,对同类事情研究统一的方法论。这也是个好方法。 【第二课的学习笔记】 昨天看同学们提交的作业,有同学感慨,一个教JS的老师经常布置语文作业,让写心里话,写学习感悟,今天又来了一篇命题作文,哈哈,真是与众不同啊。 小白入门,跟从老师的作业还有课程,我想感叹一下,竟然听懂啦! 第一堂课,老师讲解JS的运行环境,内置库、第三方库等等抽象概念,老师用去银行开通账户来类比,很容易就理解了各个内容的不同作用,以及各个内容之间的相互关系。听完后,感觉自己对JS有了一个宏观的概念。 第二堂课,知道了,编程的目的,就是处理数据,满足需求。怎么处理数据呢?一切从命名开始。 老师从数据的角度讲解了我们认识事物的过程,让我意识到,一个人的名字并不能与他本人划等号,名字加上一系列的数据才可以代表一个人。有了名字,才有调动这个数据的可能。 看了其他同学的作业,发现很多同学的网页做的很有特色。就像老师所说,通过作业可以看出,不同的人对待同一件事的不同态度。幸好和高手在一起,向他们学习,把自己的网页做的再好一点。 跟着老师的步骤,完成了静态网页的制作。 看到同学们网页制作的这么好,想要偷师,该怎么办? 如果能找到同学们的源代码,跟着做,就好啦。 然后,真的想到,找到同学的项目,clone下来,对着修改就好了。偷师了一个同学的作业。 有一点明白github的妙用了,真的可以快速成长。 昨天是第二次在大群里问问题,感觉到大家的温暖。老师怕我不明白,还单独给我讲解。很感动。 卡壳的问题,是因为自己在输入命令时,忘记加空格。 看到有同学说,自己每次都会把自己遇到的问题记录下来,真是个好习惯。 【个人的静态页面】 https://ziqi319.github.io/test/ ================================================ FILE: homework/lesson2/zhaoyinan.md ================================================ 第2次作业 赵一楠2017.08.16 不懂html,只能先把老师的网页复制过来先,我的静态网页地址:https://zhaoyn7.github.io/testWebsite/ 编程中为什么会有丰富化的数据格式? 赵一楠 2017/8/16 数据格式有多种多样,比如:数字、数组、对象,数据是由变量和对应的值所组成的。有了变量,我们就可以去操控所有的数据,让它为我所用,比如组成一个有意义的集合体,比如对一个人所有特点的的描述。然后所有的数据,不同类型的数据,是如何构建而成程序的呢?这还是个问题,需要随着后继不断深入的学习。 ================================================ FILE: homework/lesson2/zhengchengyan.md ================================================ ## 编程中为啥会有丰富的数据格式? ### 因为 有需要 ### 编程干的活儿是处理数据来给出结果,而单一的数据格式无法描述清楚所有的数据,或即使将不同类型的数据勉强描述了,进行编程处理时会较复杂。数据格式也需要迭代优化。 *** ### 举个例子 Python中的列表这一数据格式很强大,但却有元组这一和它外表很类似的数据格式。它俩在外表上的唯一区别是列表使用中括号而元组使用小括号。 那为啥需要元组呢? 原来呀,列表中的数据是可变的,啥时候修改都可以,而元组中的数据是不可变的,一旦创建,就拒绝任何修改啦。类似于国家下发的红头文件,老百姓查看也好评论也罢,但就是不能直接修改。 因此,当需要使用不可修改的数据时(例如:目标值),元组就派上用场啦。 *** ### GitHub上部署的个人网页链接 [https://powerzcy.github.io/personal-portal/](https://powerzcy.github.io/personal-portal/) ================================================ FILE: homework/lesson2/zhouhong.md ================================================ 编程中为什么会有丰富化的数据格式? 第一次接触编程,安装一个nvm就鼓捣了几个小时,数据格式,这个概念当然也是第一次接触到,我思考了一下,并查看了少数同学作业的答案,我觉得对于我这种超级 小白来说,要理解这个概念,类比,不失为一种很好的方式,就是真实世界中,需要用名词、动词、形容词、副词等描述、表达这个世界,当然程序世界也一样,因为程序就 是要处理数据,要数据肯定就有很多的格式了,才能很好的表达格式,全方位的表达的数据的内容。就是小明一样,从很多方面来描述他。 我的静态网址:https://zhouhong5201.github.io/zhouhong555/ ================================================ FILE: homework/lesson2/zhouwenming.md ================================================ # 内置库和第三方库 ## 这里的”全局对象“(global objects)(或者标准内置对象)指的是在全局作用域(global scope)中的对象(仅当未使用 ECMAScript 5 严格模式时!否则只会得到undefined)。全局对象本身可通过 this 操作符在全局作用域中获得。实际上,全局作用域就是由全局对象的各个属性组成的(包括继承来的属性)。 ## Lodash, Moment, Axios, Async … 等等, 这些非常有用的 JavaScript 库。你可能会在你的很多 Vue.js 应用中使用它们。 ================================================ FILE: homework/lesson2/zhuningning.md ================================================ # 第二课作业 编程中为什么会有丰富化的数据格式? [静态页面链接](https://sjdoudouzhu.github.io/myPage/) ## 数据格式的种类 数据格式有:布尔型,字符串型,数组,整型,列表等。 ## 丰富化的数据格式 我认为丰富化的数据格式相当于规则约束,制定规则为了更好的传递信息和快速的数据,更高效的得到结果,方便计算机高效处理数据效率。利用格式化和符号化的方式,则可以让人更加轻松的理解数据。 ## 一切从命名开始 通过命名,我们可以去操纵数据。有了数据,我们就可以通过编程的手段对数据进行处理,然后得到我们想要的结果。命名一定要有意义,方便记忆和不容易出错,也方便阅读和传播。 ================================================ FILE: homework/lesson2/zhuting.md ================================================ //lesson2作业 1. 熟读getting-started-with-javascript/study/lesson2/smaple_code.js代码。用node环境和浏览器环境运行一下代码(注意:浏览器运行请使用my_personal_info_page.html) 完成情况:完成,看的明白,肯定写不出来 执行木有问题,犯了个低级错误,先执行node命令,再执行node smaple_code.js,一直报错啊,以为老师代码标点有问题,折腾2小时,快有死的心。真是不知道node执行基本命令,处处是坑啊。虽然低级,但是我原谅我了,至少我有进步空间。哈哈,赖不住我心态好。 2. 写一遍课程总结,题目为:编程中为什么会有丰富化的数据格式? 怕理解错误,先查询了数据类型的定义,以下来自维基百科: 在程式设计的类型系统中,数据类型(Data type)是用来约束数据的解释。在编程语言中,常见的数据类型包括原始类型(如:整数、浮点数或字元)、多元组、记录单元、代数数据类型、抽象数据类型、参考类型、类以及函式类型。数据类型描述了数值的表示法、解释和结构,并以算法操作,或是物件在内存中的储存区,或者其它储存装置。 编程为啥要有这么多,应该和数据的存储空间和处理效率关系最大。空间和时间都是资源,我们的程序都是运行在服务器上,资源对应的都是钱和客户体验。所以数据类型准确的定义和使用不是小事。 另外一方面,编程是将世间万物描述成机器能够读懂的语言,也就是对象那么多,想要准确的描述对象,丰富的数据类型是必须的。 比入,想要描述的对应的认的年龄,整型足以;如果描述的对一个是一本书,并且想要描述书的自身属性,那么字符串或者数据就看自己的需要了。主观理解上:应该数组效率高于字符串 (百度了下,这点应该是错误的,代后续了解,先补课) 3. 如果有问题,在总结中把你的问题罗列出来,我会做解答。 问他:静态网页是不是都是从index.html这里开始,然后如果要调用的话,所有的js都要嵌套到这个index里面去? 【附加作业要求】 1. 在github上部署自己的静态网页,把网页地址放在总结文档里。 https://yuruoshuang.github.io/javascript/ ================================================ FILE: homework/lesson2/zhuxiaoping.md ================================================ # 编程中为什么会有丰富化的数据格式 ## **数据格式(data format)** 是描述数据保存在文件或记录中的规则。可以是字符形式的文本格式,或二进制数据形式的压缩格式。字符形式的文本格式占用的存贮空间多但透明度高,二进制数形式的压缩格式占用的存贮空间少但缺少透明度。 ++可见数据格式是一种规则,由数据类型和数据长度来描述,同时和存贮空间有关,它是用来规范各种数据类型之间的转换和运算的,因为数据类型的丰富多样和数据长度的不确定,所以需要丰富化的数据格式来满足。++ ## **数据类型** 是与程序中出现的变量相联系的数据形式。常用的数据类型可分为两大类。 #### **简单类型** 其数据的结构非常简单,具有相同的数学特性和相同的计算机内部表示法,其数据的逻辑结构特点是只包含一个初等项的结点。通常有五种基本的简单类型:***整数类型、实数类型、布尔类型、字符类型和指针类型****。 ### **复合类型** 或称组合类型或结构类型,是由简单类型用某种方式组合而成的。根据不同的构造方法,可构成以下不同的数据结构类型: ***数组类型*** 所有成分都属于同一类型。 ***记录类型***各成分不一定属于同一类型。 ***集合类型***它定义的值集合是其基类型的幂集,也就是基类型的值域的所有子集的集合。 ***文件类型***属于同一类型的各成分的一个序列,这个序列规定各成分的自然次序。 数据长度是可度量的,通常用八位二进制数组成一个字节,一个键盘上的字母、数字或其他符号用一个ASCII码表示,一个字节可容纳一个ASCII码(含一位奇偶校验位).计算机存储器的常用编址单位是以字节为单位的。计算机的通信传输单位一般也以字节为基础。 ## 静态网页地址: https://ruoyuxin2017.github.io/java2017/ ================================================ FILE: homework/lesson2/zhuyongjin.md ================================================  ### 问题:编程中为什么会有丰富化的数据格式? 回答:在回答任何一个问题之前先得了解问题中出现的概念,这里面有 >**编程** 这个概念 >**数据格式** 这个概念 #####维基百科解释: >**编程** 即程序设计,就是以程序设计语言为工具去分析、设计、编码、测试、除错等 >**数据格式** 即文档格式
### 结合我自己的理解 编程本身是用计算机的语言来描述这个世界,进而解决问题。而整个世界多种多样,需要用到多种数据格式。打个比方来说:身高170cm, 学生 一个是数字170, 一个是文本学生。 [静态页面](https://zzzyyyyjjj.github.io/text/) ================================================ FILE: homework/lesson2/zongjie-fanliao.md ================================================ # 编程中为什么会有丰富化的数据格式? -- ## 一、什么是数据格式 数据格式(data format)是数据保存在文件或记录中的编排格式。可为数值、字符或二进制数等形式。数值、字符或二进制数等形式。由数据类型及数据长度来描述。 数据类型是与程序中出现的变量相联系的数据形式。常用的数据类型可分为两大类。 * ①简单类型。其数据的结构非常简单,具有相同的数学特性和相同的计算机内部表示法,其数据的逻辑结构特点是只包含一个初等项的结点.通常有五种基本的简单类型:整数类型、实数类型、布尔类型、字符类型和指针类型。 * ②复合类型。或称组合类型或结构类型,是由简单类型用某种方式组合而成的。根据不同的构造方法,可构成不同的数据结构类型。 这些是网上给出的数据的格式的解释。  ## 二、我对于“编程为什么会有丰富化的数据格式的理解” 以前从来没有接触过编程,自己所从事的工作和编程也毫无关系,总是觉得编程是一件高大上的事情,总想着有一天自己也可以走进这个令我好奇的陌生世界。所以,一听说新大要开编程课了,一口气报了两个,一个python,一个JS。目前都还在摸索阶段,纯属不能再小白的小白,但是出于兴趣,感觉还是蛮有意思的。我在python的课程中,学到了字符串、布尔值、列表、词典、元组、类等数据格式,虽然对这些陌生的专业名词还比较陌生,但随着学习的进行,还是渐渐的理解了他们的不同。当然,JS里,又有了很多新的有关数据类型的名词,虽然有的相同,有的有些差异,不过,我想既然都是用来编程的,应该不会差的太多。那么问题来了,为什么要有这么多的数据格式呢?在我看来,存在即合理,既然存在,当然就有它的必要性。电脑处理问题,不像我们人类,可以同时通过各种感觉器官,接收外界的数据,它是非常较真的,一点都不能马虎,所以,对于外部给予的数据,也必须有清晰的界定。但是,至于为什么要这么多类型,我想,这恰好是因为每个数据类型都有自己不可替代的特征,能够用在不同的计算环境里,发挥不同的作用,从而解决不同的问题。现实的世界是多样的,有着形形色色的人和事,我想在编程的世界里,也应该是这个样子吧! 这是自己的一点愚见,欢迎批评指正! ## 三、我制作的个人静态网页 地址:【 https://fanliao1989.github.io/welcome-to-the-world-of-fanliao/ 】 ================================================ FILE: homework/lesson2/第二次作业.md ================================================ #一切从命名开始 编程中,要不断地调用某些变量,这些变量就是给不同的数据命名的结果。有了名字,就可以调用,不然叫小明难道说:170的身高,120斤的小伙子吗? 命名了,就要用,不用干嘛要命名? ##本次作业 ###1.编程中为什么会有丰富化的数据格式? 之所以有丰富的数据格式,就是为了准确应对现实世界,并不是为了丰富而丰富,也不是为了增加学习编程的门槛。 数字是为了定量,就像身高多少,体重多少一样。 文本可以用来描述和说明。 布尔型是为了判断,比如小明是男人还是女人,判断出来后,再根据不同性别做不同结果处理。 对象是伴侣...涵盖了为了定义她所包含的数组、文本描述等。 数组是由一系列值组成。 ###2.如果有问题,在总结中把你的问题罗列出来,我会做解答。 在vscode上写了老师的代码,不过却不知道如何运行。调出下拉菜单总是提示运行错误,像老师一样从git bash里运行也是一样。我自己再摸索摸索吧。 本篇如果可以存为.md格式,那么又解决了一个疑惑。 ================================================ FILE: homework/lesson2/第二次课程总结.html ================================================ 第二次课程总结

第二次课程总结.md

这是我的主页:https://wangzhong2014.github.io/javascript/

本文是新生大学徐老师编程课的第二次作业。上课时,老师以小明为例子,把一个现实生活中的小明,推到成了虚拟世界中的小明。

================================================ FILE: homework/lesson2/第二次课程总结.md ================================================ 第二次课程总结.md --- 这是我的主页:https://wangzhong2014.github.io/javascript/ 这是新生大学徐老师编程课的第二次作业。老师在上课的时候,讲了一个小明的例子,通过推到,把一个显示生活中的具体的小明,变成了编程世界中的具有代码属性的对象小明。 大学时, 我认识的一个刚学编程的同学说,编程就是创造,通过数据来创造自己脑子里面的东西。 现在有些感触。 本文主要分2部分: 1. ================================================ FILE: homework/lesson3/GaoXianfeng.md ================================================ 浏览器与 Web 服务器交互 附:![浏览器和服务器交互图](https://github.com/ruoshuigao/getting-started-with-javascript/blob/lesson3/homework/lesson3/GaoXianfeng.jpeg) ================================================ FILE: homework/lesson3/Jaykey_Guo.md ================================================ ### 基础-第三课 ![avaScript-Lesson-3-000](../Pictures/3.Screenshots/JavaScript-Lesson-3-0002.png) 驼峰式命名法: 命名的时候要突出**是什么,**能够从名称知道对应是什么东西,有什么作用,在命名的时候也要知道,不是用HOW命名,HOW的描述更多是对应的方法,例如: ```javascript document.getElementById("demo"); ``` #### 一个案例: ```javascript for ( var i = 0, j = myLikeColorsList.length - 1; i < myLikeColorsList.length / 2; i++, j-- ) { if (i!=j){ console.log(myLikeColorsList[i]); console.log(myLikeColorsList[j]); }else{ console.log(myLikeColorsList[i]); } } ``` 两倍速遍历数据的方法,同时从两头开始查找。 //从两头开始烧绳子,节省一半的时间和调用次数。 #### 作业: ![](https://ws1.sinaimg.cn/large/006tNc79gy1fph0nvpfe6j30zk0k0dln.jpg) 我的作业: ![](https://ws3.sinaimg.cn/large/006tNc79ly1fph5qgx1g5j30qi0eftci.jpg) ------ 小结: 1. 命名是一件重要的事情,是代码中团队协作的重要部分,不仅要自己看得懂,也要让任何一个懂代码的人看得懂,这样才能提高自己的输出效率和团队的合作效率。 2. 循环的使用,三个部分要齐全,一个是循环的指标(index),一个是循环的条件,最后是循环后对指标的操作。 ================================================ FILE: homework/lesson3/LiaoYuemin.md ================================================ ## Homework of Lesson 3 作业又落后了,我一定要加油赶上!!! 加班完急急忙忙回家听直播,有点蒙。 看到老师画的流程图,发现自己早晨出门时画的流程图还是有不足的地方。 要是直接改,又体现不出我的理解程度了,所以还是直接把早晨画的图贴上。 还有很多好像懂了又好像没动的地方,我在慢慢摸索提问的方式和技巧。 虽然还深处混沌,但是莫名还是会有一种一定可以学好的信心。 一个瞎了很多年的人,现在开始有点光感,这是这半个月这门课给我带来的改变。 谢谢老师和同学们的陪伴。 附:![浏览器和服务器交互图](https://github.com/Chaoshengluchi/getting-started-with-javascript/blob/master/homework/lesson3/LiaoYuemin.png) ================================================ FILE: homework/lesson3/Risexie.md ================================================ 第三节课总结 === ### 浏览器和服务器的交互原理 在浏览器当中只要我们输入一个网址(URL),浏览器就会神奇地给我们打开一个网页。翻墙之后,更是可以浏览到全世界的信息,那么这到底是如何实现的呢? 简单来说,就是当我们在浏览器输入网址的时候,我们会通过http协议,给服务器发起一次相关URL内容的请求。当服务器接收了我们的请求,解析相关内容,然后再返回信息到我们的浏览器上面。 从这里可以看出,其实我们打开网页之后的内容是在我们请求过后,服务器“一次性”给我们提供的。这些内容可能是第三方库的代码、html、css等,在浏览器给我们缓存了之后,再呈现出来。所以其实我们并不是一直和服务器相连接的,在返回了相关请求内容之后,我们与服务器的连接就会中断。  ### 数据那些事 数据有非常多种的类型,每一种类型其实都有自己的作用,而他们的传递效率也是各不相同。 当我们我们在调用一个数组数据的时候,其实电脑还同时调用了这个数组相关的长度、项数等信息。所以如果胡乱地使用数据类型的话,我们就会浪费计算机的内存和计算效率。我想别人经常提到的“优化”,其实就是更高效地实用不同的数据类型,来实现同样的需求。  ### 命名的力量 我们所编写的代码除了给计算机运行之外,还可能经过很多程序员的审阅,优秀的代码不但运行高效,还可以给别的程序员带来启发,与收获。所以在编码的时候保持代码的易读性,对于成为一名优秀的程序员来说是必不可少的。而命名数据所使用名字适否恰当,直接代表了这份代码的易读与否。 命名的要点是: >要what不是how 例如我们在输入某个用户的的数据的时候,用的应该是`'personIMF'`,而不是`'input'`。 ================================================ FILE: homework/lesson3/WangChangQing.md ================================================ # Lesson 03 课程总结 这次课高阳老师主要介绍了数据交互的流程,以及数据类型的价值、变量命名的正确方法,和JS代码中非常重要的几条语法——if,else,for循环,switch等等。 收获很多! 数据类型的价值我之前思考过,但是“不同类型的数据处理效率有所不同”这一点没有想到。仔细想想确实是如此。 变量命名这一点,可以让我们养成一个良好的习惯,有利于协同配合。 感觉高阳老师所讲的这几条JS语法还是比较好懂的。在讲解语法的过程中,高阳老师顺便还演示了Visual Studio Code的用法。我现在就在用Visual Studio来写总结,还是很好用的! 数据交互这一块似乎也不是特别难懂,但是对于细节我还不是特别清楚。需要进一步的学习和摸索。 **交互图:** ![mark](http://ou7elf9tx.bkt.clouddn.com/blog/170820/iBl7J3j5cj.jpg?imageslim) ================================================ FILE: homework/lesson3/caijinpeng.md ================================================ ##命名技巧 变量的命名方式最好能让人明白这个变量是什么意思,不能只顾自己爽,记得我14年刚学HTML时候,标签,类的命名经常是background1,background2……background110。我这还算好的,同学起码知道我这是背景,有的同学直接就是a1,a2……a110,现在还能想起当时接他工作的同学的表情。
我现在的方法是尽可能用单词,实在不会的用个差不多的单词,然后在注释里给写一下这里是什么意思。
比如: var car = 1;
这一段代码不太容易一眼就让人看明白这是什么意思, car表示车的数量,指所有的车 car?
于是改成:
var redCar = 1;
var blueCar = 2;
很明显嘛,一看就明白,红色的车有1台。
#####个人总结: 编程语言虽然是给机器看的,但是因为要和别人合作,也是给人看的,所以还是要写的规范一点,哪怕真的只是自己完成一个项目,写的规范一些,以后查看时候也方便查阅啊。
第二点是,我觉得英语真的很重要,这几天用GitHub,又背了几个单词,不用不知道,一用吓一跳,有时间就多背几个词吧。 ================================================ FILE: homework/lesson3/cloudyview.md ================================================ # 第三课 作业 ## 流程图 ![浏览器与服务器交互过程的流程图](https://github.com/cloudyview/myPhoto/blob/master/cloudyview.png) 图片网址:https://github.com/cloudyview/myPhoto/blob/master/cloudyview.png ## 一、对本节课程序的阅读心得 ### 1. name_style.js 好的命名是指,不需要去研究程序,只是看命名就知道该命名的含义和数据类型。 从方法上,首先是要说清楚,不要以为命名说了某个点,就可以了。例如,start就是一个糟糕的命名,可以有无数的理解。但是如果用startCount,我们可以知道这是开始计数,指向就很明确,也知道这是个数据类型是numbetr类型。如果用startTime,那可以推断是表达日期。 我还留意到,如果想表达布尔型,一般是用isStart。 另一个重要的技巧是:不要How,要what! 我的理解是,如何操作这个数据,不需要在命名里说明,这个事情是程序其他部分的命令决定的。真正要说明的是到底这个命名是指向什么东西的,这个不说清楚,大家看程序就会犯晕,程序的可读性就会变得很差。 ### 2. statement.js 这个例程里面展示了三种语句,即表达式/赋值语句,条件语句和循环语句。 表达式,赋值这些比较简单,用"="连接,将右侧的数值赋予左侧即可。 条件语句的结构就是 if ... else。这个也好理解,就是如果判断成立,执行if的部分,不成立,就执行else的部分。 switch语句,我的理解大约是如果有N中不同状态,如果在流程图里面画,估计就是那种一个判断,可以得出N种不同结果的情况,例如,爱好?唱歌,跳舞,吃饭,睡觉,游戏,编程,其他,那么就可以swith到这几种状态,然后做相应操作这样。 最后一种语句是循环语句,这个也比较好理解,就是有初始值,然后有一个结束循环的判断条件,然后有一个判断值(游标)本身的计算方法。 while方法,感觉不如for方法来的直接和清晰。 JS的for循环的这种方法,我感觉有一种很大的进步。这种进步就是不容易产生死循环。因为一开始你就要设定一个结束的条件。这种条件很明确的摆在你的面前,跟初始值和游标变化方式放在一起,会让程序员很容易去判断。 当然,应该还是会有死循环的,如果你非要弄的话。例如:
for (i = 0; i > 3; i--){
    console.log(i);
}
**这个循环应该被无限循环下去吧,因为永远也无法达到结束条件。这是我的猜想,结果,我在chrome里面实验的结果是:undefined。。。难道,是JS会检查死循环吗?** 另外,双游标方式,或者多游标方式,表明,一个循环里面,可以针对N组数据进行相应处理,如果使用&&,||等方式对多个游标进行联合判断,应该可以形成更加复杂的逻辑。当然,一切都是看需要。 现在感觉非常渴望能够面对实际的问题来写代码! ## 二、对数据交互过程的理解 前端(客户端)和后端(服务端),各自承担了不同的任务。前端主要满足了用户界面,交互等功能,主要的数据操纵,处理,一般在后端完成。 所以,也可以理解为前端请求服务,后端满足前端请求,提供服务的这样一个过程。 对于数据,前端也不是完全不做处理,前端也会将数据进行一定程度的处理,打包,转化成后端比较容易处理的格式,然后再交给后端进行处理的。 ## 三、软件架构与运行环境 软件架构是一个系统的设计图。从这个角度理解,软件架构的产生应该是面对某一类问题,有一些比较通用的解决思路,有人将这种思路总结归纳后,做成一个通行的设计,然后提供给其他人用。那么这个时候,你可以理解这是一个软件架构。 Node.js,并不针对特定问题或者业务,只要符合他的标准,它都可以为程序提供一个可运行的环境,所以,肯定是运行环境,而不是架构。 ## 四、数据类型的价值 不同的数据类型,决定了代码的执行效率。效率包括:存储效率,计算效率,传递效率。 选择适合的数据类型,来处理我们的数据,这是一个程序员努力的方向。如何能够提高代码的执行效率,这应该是一个程序员进步的方向。 从课程里,我们可以了解到,数组,对象,这些复合型的数据类型,计算机对其进行处理的步骤是比较繁琐的,会消耗比较多的资源。我们将一组属性封装起来,然后形成一个对象,或者将一组数据直接变成数组的这些封装操作,实际上是方便程序员来编程。对于计算机来说,一定是会降低执行效率的。 一个程序好不好,在都能完成业务需求的前提下,一个重要的衡量维度就是执行效率高不高。 还有一个需要注意的部分,定义就必须要使用。不管是变量,还是数组,或者是函数,都是一样! 如何使用不同的数据类型,这个在书中有详尽的说明。 总的来说,所有的类型都可以转化String类型,包括布尔型,null这些都可以。可以说,字符串是一个万能数据类型,将来变成应该是非常有用的。 其他类型相互之间的转换,只要能理解他们的值在这个类型中是否有意义,就比较容易可以推断了。 例如转化为布尔值,对于布尔值而言,只要有值,就应该为真,没有值的就是假。就容易理解了。 关于命名方面的理解,在刚才已经有描述,所以后面不再继续总结。 这两天的任务就是继续啃书,把基础拿下! 问题: 关于数据类型的操纵方式,有一些用".",有一些用"()",有的用"[]"。到底什么用点,什么时候用括号呢?这些用法背后的逻辑,或者规律是什么呢? ================================================ FILE: homework/lesson3/cuimiao.md ================================================ #小白cuimiao的第三节课作业总结 1.老师开课先讲解了一幅流程图,并用微信发消息为实例,讲解数据交互的案例。重点强调了time是服务器给出的,被篡改的可能性小。 2.nodejs是运行环境,是基于v8引擎的JavaScript运行时。运行时是一种面向对象编程语言的运行环境。nodejs就是js的运行环境。 一组代码结合nodejs运行环境,形成一个完整的运行环境。 而软件架构是指系统的设计图。 3.数据类型的价值,不同的数据类型,可以简化计算。比如,直接说小明是18岁,比说小明是1999年出生的,要少一步计算。 不同的数据类型决定了代码执行的效率,效率包括:存储效率,计算效率,传递效率。这体现在了内存的占用及消耗情况。 4.正确是说法:定义一个变量,并对其赋值。 5.定义了变量,就要使用它,否则它就毫无用处,就是垃圾数据。 6.命名的力量。 6.1让名字包含更多的信息。 6.2 要what 不是how。var inputData 不如 var employeeData 完整代表了变量的含义吗?判断的依据是,是否能推导出更多信息。 以问题为导向了吗?是否反映了问题而非解决方案。 7.实操 7.1表达式语句/赋值语句 var age = 18; 注意要有一个英文的分号 表达式语句和表达式是不一样的,表达式指的是 1 + 1; 7.2条件语句 if if ( age >= 18 ) { console.log( '已成年' ); }else{ console.log( '未成年' ); } console.log( '\n' ); 注释:gae>=18是表达式 7.3条件语句--switch 开关 break 是指处理完这个路径后,就要退出 布尔型只有ture 和false 没有其他情况 7.4 for循环 【编程里有三大结构:顺序,条件,循环】switch很少用 循环语句的三要素 1.循环开始的初始化变量 var i = 0 ; 2.循环条件 i < myLikeColorslist.length ; 3.计数器变量更新 i++; for ( var i = 0; i < myLikeColorsList.length ; i++) { console.log( myLikeColorslist[i] ); } 【注意: 分号“;”是代表一个空语句】 改进:绳子两头收,只需要轮询2次 for (var i = 0, j = myLikeColorsList.length - 1; i < myLikeColorsList.length / 2 ; i++, j--) { console.log(myLikeColorsList[i]) ; console.log(myLikeColorsList[j]); } 【我的疑问】 myLikeColorsList.length / 2 这个是什么意思呢????? 7.5 循环语句 while var i =0 ; while ( i < myLikeColorsList.length) { console.log(myLikeColorsList[i]) ; i = i + 1; // i++ } 8 网页交互原理 浏览器与服务器的交互 8.1获取html文件 8.2 解析html文件 8.3 获取js/css文件 8.4 更新页面/执行js代码 【作业】参考新大登录流程图画出浏览器与服务器之间的流程图 【Q&A】 犀牛书,前七章最基础,是需要认真学习的。w3school 看到break之前。 前端,把后端的数据拿过来去刷新页面,展示网页,把数据更友好的展现给用户。 后端,是指处理数据,跟数据库有关系,后端就是提供数据的服务。 {} 后边有分号是定义一个对象。当是for循环或者if语句时,{}后面是没有分号的。 全桟,老师现在不太喜欢这个词。全桟是对一个工程师无比高的荣誉,不仅可以写前端还可以写服务端,而且还能设计api,做自动化测试,搭服务器,设计数据库,架构等等。只会前端和后端,不叫全桟。 ================================================ FILE: homework/lesson3/dengxy0907.md ================================================ 浏览器与服务器交互 =============== ![](https://ws4.sinaimg.cn/large/006tKfTcly1fiqhrzblr0j31kw23v4qq.jpg) ### 题外话 > 在此之前确实没有想过打开网页也有这么多步骤,第一次看到类似的流程是在搭建shadwosocks的时候。直到现在仍然是照葫芦画瓢,关于各种协议看的也不是太明白。 > 因为一些原因自己的生活发生了意外,课程也耽误了不少,甚至拉下的课程让我觉得畏惧了,不管了,今天开始推掉所有的事情。 ================================================ FILE: homework/lesson3/fangqingyang.md ================================================ # Note 3 ## 什么是重要的? ### 把《JavaScript权威指南》的基础部分补上很重要 ### 流程图很重要 ### JSON格式很重要 ### 数据类型很重要 ### 掌握数据类型的使用方式很重要 ## 函数的定义和使用很重要很重要 ### 变量的命名很重要 ### 如何实现数据换数据很重要 ### 很多的语法在特殊的环境下才重要 #### 技巧: #### typeof可以用来验证数据的类型。如: ` typeof [1 2 3] => 'object' ` ` typeof 'hello' => 'string' ` 对上面提到的重点脑子里都没有概念,都没有感觉?这就对了,“**Hello, JS!**”,这世界现在暂时还没有跟我们建立联系,既然我们来了,就认真学,得好好的接触,深入接触这个世界。意义是我们自己活出来的。 首先自己遇到了问题,google先行,再不行,就bing ,就百度,反正肯定有办法搜到点东西出来。自己独立的在这个世界里面走一走,熟悉一下环境。看不懂的,多看几次,反正输入到大脑的数据库里,肯定是有价值的,然后感觉就出来了。看书,看issue,这是你手上配备的资源。自己琢磨好久了,还是琢磨不出来,请教别人,请教前辈。前提是要学会提问,问题的质量决定答案的质量。(包括看书) 看完了老师在github上的《第一次使用JSON》,对JSON还是没什么感觉,于是google先行。搜索"JSON"结果找到了阮一峰09年写的一篇文章[《数据类型和Json格式》](www.runyifeng.com/blog/2009/05/data_types_and_json.html)。阮一峰通过看一种数据交换格式的文档,得到了顿悟,从而对编程世界更加的了解。接着在留言下面找到了阮一峰推荐的一个JSON入门教程《Mastering JSON》,然后也把这个文章找来看了2次,有看不懂的地方,但是现在对JSON有感觉了,知道了value是可以放任何数据类型的,而不只是字符串。JSON是一种非常简洁,优雅的,可以储存任何数据类型的数据交换格式,唯一的限制是人类的想象力和硬件的存储空间。 即便没有去google, 没有主动去查上面的概念,但只要还在JS这条路上,就会越来越体会到上面东西的重要性,这些东西贯穿整个JS,是编程世界的基础设施,最终该弄懂的还是要弄懂,心甘情愿的弄懂,扎扎实实的弄懂。**基础不牢地动山摇。**同时老师还提到这里有个大坑:**“学到编码技巧,但是不知道做什么事情,不会给自己找需求,是不会有进步的。”**没有把学到的东西用出来,是不会有进步的。自己无欲无求,心中没有重要的东西,或者是不知道有什么重要的东西,没有目标是不会有动力去进步的。感觉无所谓的时候,怎么可能有动力去克服该克服的困难呢?就像考试前知道有一些知识点不会考一样,如果复习只是为了考试的话,怎么有动力去学?所以必须问自己“什么是重要的?“不断问自己,不断琢磨,否则就无所谓了,否则就没有感觉了,就没有进步了。这个需求必须很刚,很刚,刚到没有它就影响到生活。找到了这个需求,接着就是进步很大。 ================================================ FILE: homework/lesson3/guowei.md ================================================ # 小白JS入门不放弃 lesson3 *Focus Question* 当我们打开浏览器输入url地址后,到底发生了? ### 网页数据交互 根据老师上课内容,网页数据交互,简单的讲,是浏览器与服务器的数据交互。这种数据交互是通过http协议交互的。 我理解的整个交互过程分为4步骤: 1. 用户在浏览器中输入url地址,浏览器发送一个HTTP请求到服务器。 2. Web服务器解析请求,回传一个HTML文件到客户端。 3. 浏览器解析回传的HTML文件,再次向服务器发送HTTP请求。 4. 服务器传回CSS和JavaScript文件,浏览器解析并执行代码,显示网页。 *** ================================================ FILE: homework/lesson3/hanwei.md ================================================ ## 第三次作业 我们平常使用的app以及网页本质上就是数据交互,即我们提供一些数据出去,又收回一些数据。这个过程中的数据一般要经过服务器处理,可能是直接和服务器进行数据交互,也可能是通过服务器再和第三方进行数据交互。这有些像我们以前的寄信,将自己的内容写好封装在信封里,然后通过邮政网络层层上收,之后经过分拣,在层层转送出去。数据交互本质上也是这样的,我们将自己的信息封装在数据文件里面,比如json。之后通过网络发送出去,之后经过多个局部网络的传送之后到达了服务器。服务器之后对数据进行分拣,之后又经过层层网络将数据文件送到目标的手中。这个当中的服务器就像邮局一样,内部也根据功能划分,有的负责接收,有的负责分发。和传统邮政不一样的是,这里的服务器会为数据加上数据标识,这样数据相当于被权威认证过了,可以有效防止数据来源的伪造。比如在传统的寄信中我们就可以使他人的姓名和地址伪造他人的信件,当然以前也许可以通过笔迹来识别,但是在互联网上更靠谱的方式是通过一个权威的服务器,来确认来源身份。 nodejs是一种**运行环境**,它是一个运行时。只要我们输入相应的代码,它就会实时给我们一个反馈和结果。需要执行的代码和nodejs运行环境又构成了一个完整的运行环境。也就是说,只要具备了这些东西,这个环境就可以真正跑起来,来实现我们想要的功能。只有nodejs运行环境而没有需要执行的代码,那么运行环境也只是处于一种等待运行的待机状态。 一个函数和变量定义了还要使用,否则的话就是浪费存储空间,以及声明定义甚至复制的过程。 我们在使用函数名的时候要尽可能的使函数名反应出关于变量的更多信息,或者是需要解决的问题的问题点。因为我们写出的代码可能需要别人看,这样当变量包含了足够的信息别人能够很容易的理解,而不至于要通过变量作用、函数功能等使用上的信息来推出它的含义。应该做到看名称就能明白这个变量或者函数就能明白这个变量指向了什么意义或者这个函数有什么作用,而不是需要别人去阅读和分析后才能判断。退一步说,即使代码是给自己看的,由于人的记忆有时是靠不住的,为了防止自己的编写代码的过程中方便记忆不至于写着写着忘记代码名或函数名,又或者忘记一个变量或函数是做什么的做的这一步也是应该的,这样做还能很大程度的避免日后看不懂自己的代码。此外,如果能加上相应的注释的话会更加友好,养成这些习惯对提高自己的代码可读性有很大的帮助。而代码可读性高,正是一个优秀程序员的特质。 ================================================ FILE: homework/lesson3/hewei.md ================================================ # 第四课代码学习笔记 ## build_a_human.js 在这个 js 文件中,用的是表达式函数定义法: ```js var buildPerson = function () { ... } ``` 在阅读《JavaScript 权威指南》第三章的时候,书里也提到了这个知识点,但只是一笔带过。 用关键字 `js how to understand expression function` 进行搜索,结果第一条就是 MDN 上的文档,文档中还说明了函数表达式与函数声明的区别: - 函数表达式中的函数名可忽略,这样创建的就是匿名函数。 ```js var x = function(y) { return y * y; } ``` - 函数表达式可以用作 IIFE(立即执行函数表达式),在定义之后就立刻执行。 - 函数表达式没有被提升,所以只能在定义之后才可以调用。 ```js notHoisted(); // TypeError: notHoisted is not a function var notHoisted = function() { console.log('bar'); }; ``` - 命名的函数表达式,会将其作用域限制在函数体内部(官方文档里的这段话没看明白……)下面的函数 `factorial()`,只能通过 `math.factorial(x)` 的形式调用。 ```js var math = { 'factorial': function factorial(n) { if (n <= 1) return 1; return n * factorial(n - 1); } }; ``` 参考文档:[function expression](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function) ## sound_off.js 第一个报数的示例,是用顺序执行的方法来演示的。 老师用的是最原始的方式,把所要输出的内容手动地一个一个输出来。 稍微高级一点的方式,就是用循环了。结合前学过的函数声明和函数表达式,可以用两种形式来写这个循环。 ```js function solider(i) { console.log(i + '到'); } // 第一种循环形式 function startCountOff() { for(var i = 0; i < 5; i++) { solider(i+1); } } // 第二种循环形式 var startCountOff = function() { for(var i = 0; i < 5; i++) { solider(i+1); } return 1; } startCountOff(); ``` 不管是哪种循环形式,输出的结果都是相同的。那么是该使用函数声明的形式,还是函数表达式的形式,就要根据两种方式各自的特点,以及实际的需求,来决定了。 ## sound_off_2.js 第二个函数是用嵌套的方式来演示的。 为了尽量让大家能够看懂代码,老师依然是把可以写成循环的部分都一个个具体地写出来了。 而如果用“真正”的循环,应该写成什么样子呢?自己尝试了一下,写成了下面的样子,感觉写出来的代码还是不够精简。 ```js var currentSolider = 1; var soliderCount = 5; function CountOff(soliderCount) { while(currentSolider <= soliderCount) { console.log(currentSolider + '到'); currentSolider++; CountOff(soliderCount); } } CountOff(soliderCount); ``` 说明一下上面的代码:报数是从第一个士兵 `currentSolider` 开始的,当前士兵先报数(`console.log(……)`),然后将报数的任务传给下一个士兵(`currentSolider++`),下一个士兵继续报数(`CountOff(soliderCount)`)。 当所有士兵(`soliderCount`)都报了数的时候,就可以结束了(`while(……)`)。 ## sound_off_3.js 在第三个示例中,老师则是通过定义五个相似的对象,并依次调用各对象方法的方式,来为大家展示对象方法应当如何使用。 之前在学 C# 的时候,知道对象的构造函数,可以在对象实例化的时候进行一些操作。那么 JS 中能否实现在创建对象的时候,利用构造函数或者其它的特性,让它输出指定的内容呢? 用关键字 `JS 构造函数` 搜索,第二个链接就是 SegmengFault 上的文章:[深入javascript——构造函数和原型对象](https://segmentfault.com/a/1190000000602050)。文章中讲到了几种创建对象的方式,其中 `使用 new 关键字创建`、`使用对象字面量创建` 都只能通过调用对象的方法来输出。而 `工厂模式` 和 `构造函数` 这两部分自己还没有看明白,先记录一下。 下面的代码,是自己仿照着 `工厂模式` 的形式写出来的。 ```js function soliderObj(i) { var o = new Object(); o.i = i; o.countOff = function() { console.log(i + '到'); } return o; } for(var i = 0; i < 5; i++) { var soliderInstance = soliderObj(i + 1); soliderInstance.countOff(); } ``` ## kitchen_workflow.js 老师通过拆解准备一桌酒席的流程,向大家展示了如何将实际生活中的事物,转化为代码。 老师的讲解过程,是从细节到整体。也可以反过来,从整体到细节。 准备一桌酒席,需要几大步: 1. 基础的准备工作,比如打扫后厨,清洗各类用具,等等,在程序中就是 `prepare()`。 1. 基础的环境准备好了,还要去采购烹饪所需的菜、肉、蛋等各种原料,在程序中是 `buyFoods()`。 1. 一切准备就绪之后,就开始烹饪每一道菜肴,在程序中就是 `cooking()`。 1. 这四步工作加起来,就是准备酒席的完整过程,在程序中就是 `startWork()`。 而每一步之间,又是有着互相依赖的关系: 1. 基础环境准备好了,才能做所有后面的工作,所以用 `if(prepare()) {...}` 来进行条件的判定。 1. 采购好的各种原材料,要交给厨师去做菜。所以 `buyFood()` 要 `return foodsList`,然后 `cooking(foodsList)`。 1. 做好了每一道菜之后,客人才能享用,所以在 `cooking()` 中才会有 `return feast`。 整体的流程和互相之间的依赖关系明确了,其实整个程序基本就出来了。 ================================================ FILE: homework/lesson3/huangBiLing.md ================================================ ## 第三节作业 补交 这是补得非常迟的作业... 第一个图是照着老师的图改的。 ![](https://raw.githubusercontent.com/wiki/ifoundu/getting-started-with-javascript/huangBiLing1.png) 第二个图是原来自己做的... ![](https://raw.githubusercontent.com/wiki/ifoundu/getting-started-with-javascript/huangBiling2.png) 第三个图就是参考的童鞋P的老师的图了。 ![](https://github.com/xugy0926/getting-started-with-javascript/blob/master/homework/lesson3/chenyanxing.png) 说实话,还是不明白时序图跟流程图有什么区别...我还是先写"流程图"。 ================================================ FILE: homework/lesson3/jianglin.md ================================================ ### 姜琳第三次课总结 #### 今天学到了什么 关于语法的部分,因为和C++的都是通用的,唤起了将近十年前的记忆…… 关于命名的部分是以前没想过的。以前只在考试的时候应用过i,j,k,当然是为了简便,而且没有大型的程序,学完之后想来,命名复杂,带来的是后续的各种方便,非常的值得。就像项目管理的计划做的细致一些,对后面的工作非常有意义。 关于前端后端的部分,老师的介绍简明扼要。话说之前差点想报新大的全栈营,是因为时间和没Mac电脑才放弃了。不过看老师回复其他同学说做管理很适合从JS入手学习编程,又很庆幸啊。跟上入门班,争取进阶班! #### 笔记 提问途径:先思考、再google、再去新大APP找、去项目找、去微信群 json格式:交互对象,JS里常用的交换数据的格式 命名的力量:除了在赋值循环变量以外,不要再用i、j、k,也不要用简单的start、end。 驼峰命名法:第一个单词首字母小写,后面单词首字母大写。 要what不要how:针对命名,说what更有效,比如不用 inputID而用nameID。要问两个问题:完整代表了变量的含义吗?以问题为导向了吗? w3c看到JS Break之前的基础内容。 后端是处理数据,前端是提取数据,刷新页面,将数据更好的呈现。 ================================================ FILE: homework/lesson3/leizhen.md ================================================ ## 第三次作业 题外话: 我一直很奇怪老师怎么很少教代码,原来真的不在教代码,而是在教学编程的思想,在给我们设计学js的架构。我tm还懵了几节课,路和方向都给我们指明了,要真学不好,就真的不是智商的问题了。 lesson3的总结: 重点:理解浏览器和服务器之间的交互图。 以前觉得这个东西一点都不重要,现在老师说要画图,绝对很重要。对于前端的理解很重要,但我还是不知道这个现在理解了有什么用(可能以后知道把)。 nodejs是js的运行环境,软件架构就好似设计图: 知道了软件架构是什么了之后,nodejs是运行环境就不难理解了,它能提供服务,又怎么会是架构呢? 数据类型的价值:不同的数据类型决定了代码执行的效率。 和上一次作业总结的一样,果然是为了高效。 定义了后还要使用,不然没有价值: 在terminal中运行name_style.js,很奇怪没有一点输出,进入js里查看代码后才发现全是定义,难怪没有输出。 命明用what,而不是how: 没有上老师的可之前还真是随意命名的,只要自己看的懂就行了,但时间长了之后,xd连自己都不知道这个文件里面是什么东西。总结完后,马上对电脑的文件重新命名一次。这次可光是学会命名感觉就赚大发了。自己学js可能这方面还真不会察觉。 ================================================ FILE: homework/lesson3/lichen.md ================================================ ###第三课摘录 不同的数据类型决定了代码执行的效率。效率包括:`存储效率,计算效率,传递效率` `运行时`是一种面向对象编程语言的运行环境。 `node.js`是一种运行环境。 一个整型可以转化为字符串。一个字符串也可以转化成整型,仅限于数字,是为了传递效率更方便 命同时兼顾简洁和精准,能够推导出更多的信息,能够反映问题(是什么what)而非解决方案(how) 表达式语句不是表达式 `1 + 1;` 是表达式 `Var age = 18;` 是表达式语句 `if (age >= 18)`里的`age >= 18`就是表达式 编程里面三大结构:`顺序、循环、条件` 一个分号`;`结束就是一条语句 ####针对以下代码做改变实验: for (var i =0, j = myLikeColorsList.length - 1; i < myLikeColorsList.length /2 ; i++, j--) { console.log(myLikeColorsList[i]); console.log(myLikeColorsList[j]); } **改变后能成立的例子:** var i = 0, j = myLikeColorsList.length - 1; undefined for(; i < myLikeColorsList.length / 2; i++, j--) { ... console.log(myLikeColorsList[i]); ... console.log(myLikeColorsList[j]); ... } blue write green black undefined **改变后不能成立的例子:** var i = 0, j = myLikeColorsList.length - 1; undefined while(i < myLikeColorsList.length / 2; i++, j--) { ... console.log(myLikeColorsList[i]); ... console.log(myLikeColorsList[j]); ... } //无结果 ####浏览器和HTTP摘录 浏览器其实就是一个APP。 HTTP是一种超文本传送协议(HyperText Transfer Protocol),是一套计算机在网络中通信的一种规则。在TCP/IP体系结构中,HTTP属于应用层协议,位于TCP/IP协议的顶层。 HTTP是一种无状态的的协议,意思是指 在Web 浏览器(客户端)和 Web 服务器之间不需要建立持久的连接。整个过程就是当一个客户端向服务器端发送一个请求(request),然后Web服务器返回一个响应(response),之后连接就关闭了,在服务端此时是没有保留连接的信息。 HTTP 遵循 请求/响应(request/response) 模型的,所有的通信交互都被构造在一套请求和响应模型中。 ================================================ FILE: homework/lesson3/lipeng.md ================================================ # 流程图怎么画? 1. ### 什么是流程图 想不起来了。翻开老师的ppt,找到相关页面,奥,这个就是! ![](http://osv97pbuy.bkt.clouddn.com/3-5.png) 2. ### 画什么流程图? 浏览器、服务器,跟老师的例子差不多嘛。可是又又不一样。还好,老师讲了浏览器先从服务器拿html,然后再拿css和javascript。恩基本就是这样了。 ![](http://osv97pbuy.bkt.clouddn.com/3-6-exchange.png) 3. ### 用什么画? 纸笔吧。先走一个草稿。看看画什么。恩,比葫芦画瓢,比客户端登录的流程图画浏览器和服务器的流程图,这个倒不难,何况老师还讲了第 2点。 ![](http://osv97pbuy.bkt.clouddn.com/3-4.jpeg) 4. ### 正式画,拿出铅笔、白纸、三角板。 **线画的直,表示咱们态度好!!!** 先画两个框,代表 浏览器和服务器。 可是这个框,要摆在白纸的什么位置,要画多大?妈蛋,还不如学学一个软件,那个得劲儿。算了先画了这张再说。 于是,我先量了量白纸的宽度,妈蛋,三角板刻度用完了,还不够 ![](http://osv97pbuy.bkt.clouddn.com/3-1.jpeg) 用更长的尺子才能量完。恩,量完了,21cm。 ![](http://osv97pbuy.bkt.clouddn.com/3-2.jpeg) 我想,假定一个框宽3cm,两个框是6cm,21 - 6 =? 15cm。两边分别留白5cm,间距5cm,刚好21cm!!! 天才。 ![](http://osv97pbuy.bkt.clouddn.com/3-3.jpeg) 很快,半小时之后,基本画完了,用iPhone 6s拍照留念。 5. ### 美化图片 拍出来歪歪扭扭的,先调整各大小,把漏出来红色桌面截掉。恩,两边留白再平衡一下。恩,发到电脑上看看。 这么黑,右下角还有一块拍照手机的影子! ![](http://osv97pbuy.bkt.clouddn.com/lipeng-%E7%AC%AC%E4%B8%89%E6%AC%A1%E4%BD%9C%E4%B8%9A%20%28%E4%BF%AE%E5%9B%BE%E5%89%8D%EF%BC%89.jpg) 再在手机上调一下光,恩,黑白效果很赞。再发到电脑上看一下,手机的影子几乎不见了: ![](http://osv97pbuy.bkt.clouddn.com/lipeng-%E7%AC%AC%E4%B8%89%E6%AC%A1%E4%BD%9C%E4%B8%9A%20%28after%29.jpg) 前后对比还是很明显嘛。感觉太白了,嗨,下次还是学习用软件工具吧。 6. ### 大工告成,交作业!!! 传git, 我知道,传 git 前,要先 把upstream的流弄下来。[感谢 @新大张丽娜同学 的帖子](https://github.com/xugy0926/getting-started-with-javascript/blob/master/topics/%E5%A6%82%E4%BD%95%E4%BB%8E%E4%B8%BB%E9%A1%B9%E7%9B%AE%E6%9B%B4%E6%96%B0fork%E7%9A%84%E9%A1%B9%E7%9B%AE.md)。 可是怎么丢弃没有add的改动呢? 研究了一下: ```git git checkout -- filePath 用来清除 filePath ,没有缓存,但是不想要的改动。 filePath 也可以是目录,比如当前目录 . 或者上级目录 .. 就是这个目录下所有 未add 的改动。 ``` 7. ### 总结 三角板不够长,准备一个直尺很重要! 三角板不够长,准备一个直尺很重要! 三角板不够长,准备一个直尺很重要! 老子一定要学一个 软件工具,画流程图! 老子一定要学一个 软件工具,画流程图! 老子一定要学一个 软件工具,画流程图! ================================================ FILE: homework/lesson3/liujuanjuan1984.md ================================================ # JS编程入门Lesson3作业 by刘娟娟2017-08-28 ## 浏览器与服务器的交互图 ![浏览器与网页服务器交互图](https://user-images.githubusercontent.com/31027645/29758481-79e7e21a-8be6-11e7-86bc-2fed0d2c3495.png) 非常粗糙的图,直接用excel标记的。我确实想节省时间,赶上进度。 第三节课,印象中依然是在讲变量命令规范。这带来的易读性很重要,利己利人。 一个可以分享的小技巧: 直接在你自己github的项目issue中粘贴图片就能获得地址。 ================================================ FILE: homework/lesson3/liuxiaohaohao.md ================================================ # 流程图是一个很好的表现形式 >“既然学习了技术,就要尝试用技术的表现手法来表达我们的意思。同样,流程图可以运用在各行各业,可以很清楚的表达交互的过程。” 关于流程图我的理解是:事无巨细地把事情操作的每一个步骤设计出来,同时在设计的过程中考虑到每个步骤会遇到哪些问题,并给出相应的解决方案。 在设计过程中也要注意到无重复,无遗漏。流程图的设计过程,就是帮助自己梳理事情运行的逻辑,帮助进行下一步执行的设计。 #nodejs是一个基于Chrome V8引擎的Javascript运行时。 运行时是一种面向对象编程语言的运行环境。nodejs就是js的运行环境。 #数据类型的价值 不同的数据类型决定了代码的执行效率。效率包括:存储效率,计算效率,传递效率。 #定义了就要使用 定义了变量,一定要使用。数据类型很重要,对于不同类型的使用方法也很重要。函数很重要。 #命名的力量 大多数人在命名这件事上都是被误导的。你写得代码很6,运行也没有问题,但是别人看不懂啊!这就麻烦了。这也是高手和普通程序猿的区别之一吧。 原则:1.你的名字一定要包涵更多的信息,不能让人一看内心产生了很多意思,去猜测你的意图到底是哪个。 2.要what不是要how,就是说你不能只是描述动作,你要展现出内容。比如,“打架”就是一个动作,而“打小明”就是动作之上的内容,“打架”就不如“打小明”好。 好名字的判断依据:1.完整代表变量的含义了吗?(更多的信息) 2.以问题为导向了吗?(反映问题而非解决方案) #需求 要思考为什么老师会想到这个需求?要自己给自己找需求。而需求需要建立在你的思考,逻辑上。 ================================================ FILE: homework/lesson3/panqi.md ================================================ # 第三次作业 **关于Markdown的用法,今天忽然想到之前在新生大学微信公众号中看到过一篇相关文章(作者是乔向阳),当时对这种方法很陌生,只是进行了文章收藏,搜索出来通读之后,对一些基本用法有所了解,知道了第一次作业格式不对的原因是在#后面没有空格,在提交第二次作业时已进行修改。再次提交作业,进一步理解和巩固了git的主要用法,关键还是要多用!** ## 阅读两份代码 *之前看老师在第二课给出的代码时,纯小白的初次,超级懵!开始都没有理解很多内容是为了便于学习做出的注释,敲代码时照单全打;也不晓得可以分段敲完,就运行看看什么状况,傻傻的一直在敲,感觉好长、好无助!如今再回看,也不是那么难哦!* ### 变量命名要点 -完整代表变量含义,能够推导出更多信息。要具体明确,不能简单模糊。 -以问题为导向,反映问题而非方案。要体现“是什么”,而不是“怎么办”。 **数据类型:数字(number)、文本/字符串(string)、布尔(boolean)、数组(object)、对象(组合数据)(object)。** **定义变量、赋值给它、使用。** ### 各种语句 1. 表达式语句/赋值语句:诸如赋值和函数调用这些有副作用的表达式,可以作为单独语句,把表达式当作语句的用法,也称做表达式语句。(摘自犀牛书) 2. 条件语句:if、switch 3. 循环语句:for、while -初始化变量:var i = 0; -循环条件:i < myLikeColorsList.length; -计数器变量更新:i++; _多种表现形式:常规写法、初始化变量提前、初始化变量提前和计数器自增放在循环体内,多个初始化变量、多个计数器变量更新。_ _轮询数组:两头同时轮询,时间只用一半。_ **阅读代码、敲出代码、运行代码,通过一遍练习有了初步概念和认识,对照犀牛书的相关内容大概看了一下,并不是很明白,自己看书明显没有跟随老师的传授、总结、提炼、引导那样有感觉,也许是自己太白了,还没有培养出编程思维方式,而且学习犀牛书的时间太少了,也没有完全掌握要领,只能在不断做、不断学、再做、再学的多次反复过程中逐渐领悟。** ## 抓紧补课 趁着休假期间,努力补习之前的课程和作业。今天认真阅读了老师在技术文档里写的几篇函数相关文章,明天要结合第4节课给出的代码进行练习,在实操中加深对函数的理解。自己要加油,期待在最后一堂课上能够参与完成老师设计的小节目!昨天直播时,老师提到其实课程结束时,对于大家来说只是一个开始,正如开课时老师就说过,这门课更多是希望大家转变思维模式、多角度思考,能够习得分析问题、解决问题的能力。即便掌握了基础入门知识,后面仍需要时间扩充学习内容,通过创建运营具体项目,在使用中不断完善和提高。关键在于用,一段时间不用,学过的知识就都全盘交还给老师了。 这次还报名了安卓开发那门课,只听了两节,完成了最初一次作业,当时提交的时候特别开心,但后期因为时间的原因,还有电脑配置差异,落下课程就跟不上了,只好放弃了。还好,JS课程仍在努力学习,也学到很多东西,后面内容难度增加,要投入更多时间和精力,相信一定会收获满满! ================================================ FILE: homework/lesson3/sophieQi.md ================================================ ## 浏览器和服务器之间的交互图 ![交互图.jpg.png](https://i.loli.net/2017/08/22/599c54149eb28.png) ## 老师给出的浏览器和服务器的顺序图 ![image.png](https://i.loli.net/2017/08/22/599c545678101.png) #### 变量名称 > 1. 完整代表了变量的含义吗? -> 推到出更多信息 > 2. 以问题为导向了吗? -> 反映了问题而非解决方案 从定义的变量名称,可以看出是什么类型的变量;不能是统称的名字,可以具体到事物本身。 定义一个变量,赋值給他。赋值了就要使用,才有意义。 变量名称要符合是how,不是what。 *举例:* ```node var end = 100; // bad。 end什么?不明白 var endCount = 100; // good。可以推导出是结束数字,number类型。 // 表示一个输入的雇员信息(inputData不好,只能表示是输入的数据。输入的什么数据?不清楚。只知道how,不知道what。) var employeeData = { // good。 这是个雇员的数据(很明确知道what是什么),很清晰。 name: 'xiaoming', age: 18, sex: 'man' } ``` ================================================ FILE: homework/lesson3/taobao.md ================================================ # lesson3_第三次作业_交互图 This is the addtional homework for lesson3. The instructor suggested two main points: 1. two examples about how date transmission between two devices. 2. the most important thing starts with beignning. how to name the varible compare with how date transmission between two devices, I think that memory work theroy is more important. If news can understand how one line code as date trasnfer between different function. However, they also need to know hwo to change the typre of Date, and make more efficily on transmission. It also need information about global scope and loacl scope. I will wriet one paper for the memory of Javascript. On the other hand, the basic skill, how to name varible, is most imortant. The instructor says :"One good programmer is use the best way to solve your problem", but I also believe that "Any of other programer can easily understand your code and update them." Before this lecture, I think I can put as many commit in the file and make the variable more meaningful. Recently, I realized that I need to make my varible more formal and meaningful. I need to define not only how this date do but also what is this date. Here is the example: var input = (); var inputPersonName = (); --- 第三次课程,讲解数据交换,给出了基本的数据类型,并且引出了数据类型的转换用于其自身的特性:传输效率,储存效率,计算效率。而后讲解了命名的重要性,分享了自己的经验,“要what 不要how”,以次来使声明的更有意义。 同时表示了如果只是声明而不定义的话是没有意义的。 --- 已解决问题: 1. 声明了node.js 是运行环境。(运行时) 2. 命名的tips 新的问题: https://github.com/xugy0926/getting-started-with-javascript/blob/master/study/lesson3/statement.js 1. 第74行代码,如果第6行代码不是4个数据,或者说不是偶数个数据,那样中间的数字就会重复输出。这样是不是要进行预先的length 判定,还是说在最后输出的时候进行删除重复项?但是数据库提取中,这样会无形曾加一组数据出来 ---- 2. 老师教下抓包放包,或者有教程推荐吗?中英文都可以,之前自学不是很思想,今天写作业的时候,经常报错 ================================================ FILE: homework/lesson3/wangwei.md ================================================ ## 1. 阅读study/lesson3的两份代码。 >已阅读 ## 2. 画出浏览器和服务器之间的交互图 > ![交互图](http://a3.qpic.cn/psb?/V10yXgCs06YSTK/5cLsn2N2hgsjK0DMHrMyKarLy6kXZ3mKcp1oB.XFT60!/b/dG0BAAAAAAAA&bo=gALrAwAAAAARCFU!&rf=viewer_4) ================================================ FILE: homework/lesson3/wangyunfei_zongjie.md ================================================ ## Lesson three 课程总计 ## 一、 本节课,是JavaScript入门第三节,课程一开始讲解的是数据交互的实际案例。直接上了两个例子。 一个是新生大学app账号登录,另一个是微信发消息。这两个例子在实际应用场景下都是很简单的操作,但是经过剖析,其实都是代码一步一步运算的结果。 计算机不是人脑,他没有人那么聪明,人的话可以通过思考直接判断对与错。而计算机必须先赋予它相关的值,并通过逻辑运算才能判断false与true。 通过这两个例子,切身能体会到代码在程序实际运行中的一个存在感,一种代入感。 之前的课程,一直不明白,布尔类型,false与true用在何处。原来在账户登录这一个环节中,就是典型的一个运用。 密码的对与错,程序他只能判断为false与true,屏幕上弹出的密码错误,那只是程序在判断为false后弹出的一个message。而message并不是计算机的一个逻辑运算结果。 微信发消息这一实例,就能很形象的把 “对象”这一数据类型,带入到环境中,实质上微信中发送的一句话,实际上就是一列对象数据。 ## 二、 既然是数据交互,那当然得有交互的双方。一方是操作端,另一方就是服务器。说道服务器,我更形象的觉得他就是个幕后操作端,一个黑盒子。在后面课程中,老师又剖析了网页交互原理实例。 浏览器与服务器的交互实例,与app账号登录这两个实例,既有共同点,也有区别。 两个例子都是通过前端操作与服务器之间进行数据互动。 但是app登录实例,不仅体现了前端与服务器的交互,更能体现出数据在服务器里面的一个逻辑运算,然后反馈给前端。 而浏览器与服务器之间的交互,更直观体现的是数据与服务器的一个相互请求与访问。但是我认为这两者之间其实可以相互嵌套的,在网页中也可以嵌套进账户登录这样的模块,建立起前端与服务器间一个复杂而又紧密的交互关系。 ## 三、 今天的课程除了实例,自然少不了干货。今天即复习了以往的JavaScript知识,也讲了一些新的知识。 今天的课程又让我更深刻认识了数据类型。数据类型虽然类型繁多,但是他们之间也有联系。比如:字符串类型可以强制转换为整形。 虽然有些数据类型在某些场景下都可以通用,但是他们之间也是有区别的。 #### “不不同的数据类型决定了了代码执行的效率。效率包括:存储效率,计算效率,传递效率” 课程中着重提到了变量的命名。 这个名字虽然可以叫阿猫,也可以叫阿狗,也可以叫其他。 同一个变量,不同的命名,所赋予的意义是完全不一样。 变量的名字要尽可能的包涵更更多的信息,方便更多的人阅读。 ## 四、 在课程中,老师也提到了函数,更在实操中提到了语句。 #### 语句包含:表达式语句/赋值语句 、条件语句(if、switch)、循环语句(for、while) 条件语句与循环语句,我更感觉是在为代码的运行提供一个运算的框架、限制条件....更多的理解,需要我们更多的实操,来加以理解..... ## 五、 根据课程内容,我将本节课的作业,用白纸勾勒出了浏览器与服务器的运行图,一共三幅图,请老师恕我绘画水平低下、与课程理解的浅薄。 因为作业关系,我需要去网上搜索相关信息。搜索的平台主要是百度,这方面的信息很少能搜到权威性的解释,主要是以网友论坛发帖为主。 网上的这些关于交互信息的帖子,包括其他的编程知识,在这些论坛、发帖中很多很多,甚至用一个话题都能产生很多观点。 作为小白的我,确实增长了很多见识,但是由于自身是小白,很难甄别其中的真伪。甚至会产生误导。 有些帖子都是十几年前的发帖,但是并不能因为帖子年数长,就断定帖子的内容有误,作为小白的我,也只能多看不同的论坛,多看帖子下面评论与回复,根据理解,理性的采纳。 浏览器交互信息网上一搜索,一大堆发帖,虽然不同的版主他们的观点不一样,但是大致原理都是一样的。同时也能看到其他的知识点,比如:Http协议、用户界面、浏览器引擎、渲染引擎、 UI后端、JS解释器、GET方式、POST方式...... 不过这些知识点,都不是在一个版主下,而是在很多个网页里、论坛里,显得难免有些鱼龙混杂。需要我们耐心的去学习。 我是一名学习js语言的小白,我正在努力入门中....... ================================================ FILE: homework/lesson3/wenliuxin.md ================================================ # 如何学习编程 * 自学 * 老师提示重点 * 问 ## 材料: * 书 * W3c ## 思考途径: * 自己思考 * 去新大app论坛 * 去老师github的issue看 * 群里问 # 数据交互 前端获取信息,推送给后端,后端核对,推送消息给前端;登陆失败,登陆成功。 # 运行环境 Node.js 是运行时,也就是运行环境。 node.js可以看作一个内部有V8引擎、内置库的正在运行的服务或软件(就是运行环境)。它正在运行,node sample.js在node里解析代码翻译代码...包括clone、IE都是js的运行环境。 # 数据类型的价值 一个整型所占的内存是确定的,如1、2、3。 但是一个对象、string等所占的内存是非常大的。 .length()获得长度,其实它已经帮我们做了很多功夫。 # 定义了还要用 没有用的定义,没有价值。 用,还不一定只是直接用,数字string可以转化为整型,整型也可以转化为string # 命名的力量 用what而不是how 要推出更多的信息,并且信息确定,而不是什么都可以 # 网页交互原理  输入网页地址,请求访问  服务器接收,发送html文件给用户  网页解析代码,发送请求css和js  服务器发送css,js给用户 ================================================ FILE: homework/lesson3/wufan.md ================================================ # 阅读study中lesson3的两个代码文件 一 命名要清楚,要让人读懂,更友好一些。好的命名判断标准: 1得出是什么数据类型或者更多内容的信息; 2得出一个具体的信息,可以精准确定位置。 二 表达式与表达式语句、赋值语句的区别: * age = 18 这是表达式 * var age = 18 ;这是表达式语句 ​ var age; * age = 18;这是赋值语句 * for循环语句的初始值语句,条件语句,计数器变量更新语句。 * switch语句适用于有限个样本空间元素的使用,其余不应用,特别注意default的使用 * while和do while的区别就是符合条件执行,和不管符合条件与否先执行,然后符合条件再执行。 # 画出浏览器和服务器之间的交互图 ![](https://ws3.sinaimg.cn/large/006tNc79gy1filgi5z489j30zk0qojti.jpg) ================================================ FILE: homework/lesson3/wukuipin.md ================================================ ### 碰到一个问题 #### 仓库同步时出错 根据《Git常用操作笔记》文档里面的提示操作,将自己的仓库可老师的同步。在执行: ``` git fetch upstream master ``` 出现以下错误提示: ``` git fetch upstream master fatal: unable to access 'https://github.com/xugy0926/getting-started-with-javascript.git/': Failed to connect to github.com port 1080: Operation timed out ✘ antarts@wukuipindeMacBook-Pro ⮀ ~/javascriptbridge/getting-started-with-javascript ⮀ ⭠ lesson3_homework_wukuipin ⮀ git remote -v origin git@github.com:antarts/getting-started-with-javascript.git (fetch) origin git@github.com:antarts/getting-started-with-javascript.git (push) upstream https://github.com/xugy0926/getting-started-with-javascript.git (fetch) upstream https://github.com/xugy0926/getting-started-with-javascript.git (push) ``` ![](https://ws2.sinaimg.cn/large/006tKfTcgy1fimwfrlsrkj311d02mdg4.jpg) #### 解决办法 1. 在终端执行: >git remote rm upstream 2. 将 https:// 更换为 git@ ,同样终端执行: >it remote add upstream git@github.com:xugy0926/getting-started-with-javascript.git 3. 然后再按照《Git常用操作笔记》往下操作即可。 这是我更换后,成功同步的画面: ![](https://ws4.sinaimg.cn/large/006tKfTcly1fimwo6byqxj315f0qz3zv.jpg) #### 总结 对于出现这个问题的原因不是很了解,似乎是代理的问题。希望这能帮助到遇到同样问题的同学! ================================================ FILE: homework/lesson3/xianengqi3.md ================================================ ## 画出浏览器和服务器之间的交互图 *我仿照了'老师的课件'照着画了一遍,自己又模拟了3遍草稿* --- > 画流程图的自我体验 刚开始画的时候完全没思路,不知如何下笔,喝着矿泉水酝酿了一小会,顺便去上了个厕所,拾起笔照着老师放出来的两张图片开始画。 **打了三张草稿** 1.'第一遍'和'第二遍'完全依葫芦画瓢。 2.第三遍在脑海里整理了自己访问'新生大学'网页的流程,梳理了一遍访问'新生大学'的思路。 以下是梳理的思路 --- *我在浏览器输入'新生大学'网址----->>>>浏览器把网址传给服务器---->>>>服务器接收后---->>>>把解析好的'新生大学'主页返还给浏览器---->>>>浏览器收到了'新生大学'的主页,发现主页里有好多课程,我找到了'徐老师'的课程 给我吧---->>>>服务器甩给浏览器'徐老师'的课程---->>>>浏览器接收了服务器传送过来的'徐老师'课程---->>>>最后我通过浏览器看见了'徐老师'的课程。* **感觉好拗口,嘻嘻** ## 浏览器和服务器的交互图 ![X](http://a1.qpic.cn/psb?/V11gEvOt4cCVez/ZIDEzO7GoV34harwrcch.FNJBa5Cvu4N4kmGWld*1Mk!/b/dDwBAAAAAAAA&ek=1&kp=1&pt=0&bo=gAJVA4ACVQMRADc!&vuin=920986617&tm=1502982000&sce=60-2-2&rf=viewer_311) --- 字迹有点潦草 > 禅定时刻 日出东海落西山,愁也一天,喜也一天, 遇事不钻牛角尖,人也舒坦,心也舒坦。 **引用 ---槽边往事 和菜头。 ================================================ FILE: homework/lesson3/xiaochaoge.md ================================================ # 第三课 程序大小和程序的运行效率 [TOC] 这节课关于代码部分,想到之前玩的一款编程游戏对程序大小和程序的运行效率这件事,就拿出来聊一聊,也当作这节课的小结吧。 ## 游戏介绍 **游戏** : Human Resource Machine ![游戏 logo](http://is2.mzstatic.com/image/thumb/Purple49/v4/79/b2/ba/79b2ba86-20e2-385d-ed50-2d4afc0c24bf/source/75x75bb.png) 这款游戏更多像一个**伪代码**,去实现一些程序的需求,满足要求的程序就能过关,但在游戏中,有两个特殊条件,满足任何一个条件,这个关卡会达到一星,而分别满足两个条件,就能达到**两星**。 游戏的下载地址见文末。 ## 游戏规则 这两个条件是: > 1. 程序长度的最短; > 2. 程序执行的步数最少。 ![两星](http://ovdtbcicu.bkt.clouddn.com/两星.png) ## 第一颗星 我想说的就是这个游戏的 `第二关 繁忙的收发室` 的两星之旅: 你需要输出 10 个数字 > **要求1**: 不能使用超过三个命令 > **要求2**: 平均不超过25步 ![IMG_0038](http://ovdtbcicu.bkt.clouddn.com/IMG_0038.png) 那我们有哪些代码呢? ![IMG_0040](http://ovdtbcicu.bkt.clouddn.com/IMG_0040.png) inbox 就能输入,outbox 就能输出,jump 跳出循环,不能使用超过三个命令几乎很简单了: ``` -- //jump 返回的位置 - inbox outbox - jump ``` ![IMG_0041](http://ovdtbcicu.bkt.clouddn.com/IMG_0041.png) 但是我们算算第二个要求: 每执行一个数字,需要 `inbox -- outbox -- jump`,三步程序。10 个数字,10 × 3步 = 30 步,虽然程序很短,但是根本做不到不超过 25 步。 ## 第二颗星 10 个数字怎么做到步数最少? 每一个数字执行一个 `inbox -- outbox `,但并不`jump`,即不使用循环体,需要多少步? 10 × 2 步 = 20 步,已经能实现目标了。但是这样的程序长啥样 ``` - inbox outbox - - inbox outbox - - inbox outbox - …… //一共有 10 个 inbox, 10 个 outbox ``` 这样的程序难免有点无聊,而且易读性太差,能不能使用循环体,但是简化流程呢? 循环体的出现,使得代码的阅读次数在循环体每遍历一次,就多运行一次,换句话说,循环体内执行的程序次数越多,效率越高。 ``` -- //jump 返回的位置 - inbox outbox - - inbox outbox - jump ``` ![IMG_0042](http://ovdtbcicu.bkt.clouddn.com/IMG_0042.png) 如果代码变成这样,执行的次数会怎么样呢? 每执行 2 个数字,需要 `inbox -- outbox --inbox -- outbox -- jump`,五步程序,比之前执行 2 个数字,需要`inbox -- outbox -- jump -- inbox -- outbox -- jump` ,六步程序,少了一步。 对10 个数字而言,**(10 ÷ 2) × 5 步 = 25 步**[^1],达成目标。 [^1]: 每执行 2 个数字需要 5 步,10 个数字,10 ÷ 2 ,循环 5 次,每次执行 5 步,一共执行 25 步。 ## 类比:JS 课程中的绳子两头烧 绳子两头烧,就是拿第二颗星星的过程: ``` var myLikeColorsList = ['blue','green','black','white']; ``` 定义变量:`myLikeColorsList` ``` for (var i = 0;i < myLikeColorsList.length; i++){ console.log(myLikeColorsList[i]); } ``` 用一个变量直接输出,相当于分布执行**四种颜色**,需要运行四次。代码很简洁易懂,但是执行效率不够高。 ``` for (var i = 0 ,j=myLikeColorsList.length - 1; i < myLikeColorsList.length / 2;i++,j--){ console.log(myLikeColorsList[i]); console.log(myLikeColorsList[j]); } console.log('\n'); ``` 用两个变量直接输出,每次分别两个量,四个数字,只需要循环两遍,代码看起来冗长,但是执行效率更高啊! ### 思考题 > 给一个变量 >`name`='zhangwuji','zhoumin','xiexun','zhangsanfeng','huangrong','zhoubotong'; > >你能使用 **三个变量** 以及 **for 语句** 实现 **只循环两次** 就能获得`name`的 json 代码吗?试一试吧! ## 游戏下载 > 游戏的价格为 30 元,**苹果手机**[^2]想玩的可以点击:[下载地址](https://itunes.apple.com/cn/app/human-resource-machine/id1005098334?mt=8) [^2]: 如果你的手机是安卓手机,请自行搜索「 Human Resource Machine」或「人力资源公司」去下载。安卓的应用市场太多,而我没有安卓手机,不确定推荐的软件会不会恶意扣费。 ------- 小超哥 2017 年 8 月 30 日 ================================================ FILE: homework/lesson3/xiaoyi.md ================================================ ## 第四课作业(无总结版) ### 1.关于命名 为了增强代码的可读性,在给变量进行命名的时候,要使得代码有意义。比如 var id = '1234567'; //这就不是一个好的命名方式,因为读代码的人会下意识的问:什么 id? 而 var nameId = '1234567'; // 这就是一个好的命名,因为一看就知道是名字的id,代码有意义,不仅别人容易看懂,自己在以后想改进的时候读起来也会更容易。 ### 2.关于 switch 语句 ![](http://oqym24k6p.bkt.clouddn.com/xiaoyi/2017-08-22-switch.gif) 我在刚开始看**switch**语句的时候有一点不明白,因为**if-else**语句很好理解,判断条件直接跟着要执行的代码,哪个正确就执行哪一个。 但是我在看 **switch**的时候有一点懵圈,看了一遍后终于明白了: switch (age >= 18) { case true: console.log('已成年'); break; // 退出循环 case false: console.log('未成年'); break; // 退出循环 default: console.log('not a human'); } 它不像if-else语句 两个条件放到了两个大括号里面去,这里是放到一起的。其实上面的语句里面可能有三种输出。正如我在截图里面展示的一样。我在上面的代码里面把它认为的分成了三个部分,注意这三个部分是相互独立且排斥的。只可能有一种情况输出,比如 age>= 18,这个判断语句是正确的,那么程序就找 **case true** 找到了之后就执行它下面的那条语句,然后到了 break 就跳出switch语句。 注意:switch后面的条件正确,那么程序就去找 case true,如果不正确就去找 case false 或者 default。比如我把程序改成: switch (age >= 18) { case true: console.log('未成年'); break; // 退出循环 case false: console.log('已成年'); break; // 退出循环 default: console.log('not a human'); } 现在来看,age>=18是正确的,那么就要找 case true,并执行后面的语句,输出 **未成年**。 ### 3.两张交互图 ![](http://oqym24k6p.bkt.clouddn.com/xiaoyi/2017-08-22-IMG_5903.JPG) ![](http://oqym24k6p.bkt.clouddn.com/xiaoyi/2017-08-22-IMG_1950.JPG) ================================================ FILE: homework/lesson3/xiongliyu.md ================================================ # 第三课作业 ![交互图.jpg](http://wx1.sinaimg.cn/mw690/be5aedd1gy1fjpwbl69ekj21kw23u4qp.jpg) ![image.png](https://i.loli.net/2017/08/22/599c545678101.png) ## 课堂笔记 ### 命名方式 命名需要注意地方: 1. 完整代表了变量的含义吗? -> 推导出更多信息。 2. 以问题为导向了吗? -> 反映了问题而非解决方案。 3. 要what不要how:针对命名,说what更有效,比如不用 inputData而用 employeeData。 4. 驼峰命名法:第一个单词首字母小写,后面单词首字母大写。 >个人感觉:以后再多人协作共同完成一个项目的时候,这样的命名就会显得非常的重要了,我在写HTML的时候给标签的id和class命名的时候就很困惑,感觉不知道怎么命名,最命名也估计只有我能看得懂吧~ 现在我估计也可以用这样的方式来给变量、函数名和HTML标签里的id、class命名吧。 ### 数据类型 之前只知道不同形式的数据,需要打包成不同的数据类型。 数据类型之间是尅转换的。 现在知道了: 数据类型决定了代码执行的效率。效率包括:`存储效率,计算效率,传递效率` > 个人感受:如果想老师上节课说的:`程序的目的是:处理数据,给出结果`的话。那么了解数据有关的语法就很重要,而这些好像就是老师推荐的犀牛书里面的1~7章节的内容,方向都说的这么明白了,还学不好就是自己懒惰了。 > 不能懒!!之前看了1~5章节,打算今天把6~7章节先通读一遍。从第二遍开始就要主动思考带着问题去看了,边看边用电脑打代码!!加油 ### 交互图 >个人感受:其实之前我不太明白为什么要画图,但是去做了之后,发现从网上查资料,变化边理清思路,最后画出来了,就算是错的,但是我自己画的内容在脑子里很清晰。 所以以后我遇到遇到搞不懂或理不清关系的时候,就记得可以画画图,把思路先理清楚。 ### 其他 nodejs是一种**运行环境**,不是框架。 nodejs是运行环境,是基于v8引擎的JavaScript运行时。运行时是一种面向对象编程语言的运行环境。所以nodejs就是js的运行环境。只要我们输入相应的代码,它就会实时给我们一个反馈和结果,这样构成了一个完整的运行环境。 nodejs运行环境主要的内容(除了V8引擎)好像是:js标准库+nodeAPI ### 循环语句的三要素 * 1. 循环开始的初始化变量 var i = 0; * 2. 循环条件 i < myLikeColorsList.length; * 3. 计数器变量更新 i++; >这三要素,应该就是我们学习的重点循环语句吧 >看完代码的感受:原来for循环还可以这样写~原来还可以从两头同时开始遍历~ 循环中嵌套循环好复杂~ >继续练习老师给出的代码。好好学犀牛书吧~ ================================================ FILE: homework/lesson3/xugaoyang.md ================================================ 首先想告诉同学们,由于作业量很大。而且前面给大家留的是作文(总结)形式的作业,我要一篇一篇去阅读,批改速度会很慢。我一定会读,发现问题时一定给出建议。倘若有遗漏,merge了你的作业但没有批复,请你主动提醒我一下。 所有的作业都不怕晚,只要在课程结束时间内发pr我就收。 重点是下面:) 【作业内容】 1. 阅读study/lesson3的两份代码。 2. 画出浏览器和服务器之间的交互图(不会?什么是交互图?完全没思路?那你肯定没上课或没看回放:)) 3. (备选)如果你还想写课程总结?请继续,我很喜欢看你们的总结:),有总结必回。 【提交方式】 1. 请向getting-started-with-javascript项目发起pull request。 https://github.com/xugy0926/getting-started-with-javascript 2. 交互图格式:你名字命名的png图片。(如果还想继续写总结给我看?老规矩,你名字命名的md文件,和png图片一起发pr) 3. 提交homework/lesson3目录下。 ================================================ FILE: homework/lesson3/yammy.md ================================================ ## name style 变量的命名方式最好能完整反映出变量的含义(What),即让读代码的人一眼就明白what is it. 比如: `var cart = 1;` 这一段代码很难一眼就让人看明白这是什么意思,到底是指购物车 cart 数量,还是指某台购物车 cart ? 如果改成这样就一目了然了:`var cart_total_numbers = 1;`,很明显嘛,一看就明白,购物车数量总共是1个呗。 --- **小结:** 像 JS 这类解释性的语言,是人类友好型语言,虽然是代码,但人类读起来就像读英文一样,但这英语每个人写出来的却几乎完全不同,有的人写的清晰明了,有的人写的乱七八糟。 如果是一个人独自写代码还好,一旦需要协作,就会有人来读你的代码,你自己有时也会时不时的需要维护代码,写的不好的代码,尤其是变量定义的不好的代码,就会很难看懂,就会成为相互协作的阻碍。 ## 浏览器和服务器之间的交互图 ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-16-IMG_0088.JPG) 抱歉,图片可能不太清楚。 --- ps: 徐老师,我偷看了一眼 lesson4 的代码,其中 study/lesson4/type_array_sample.js 第23行代码:`myLikeColorsList.push();`这里调用的 push 方法貌似跟注释不太匹配呢,嘻嘻。 ================================================ FILE: homework/lesson3/yanqingmu.md ================================================ # 从高维度理解代码基础知识 我自己不是第一次学习代码了,其实就是在不断的反复学习基础知识而已。结果常常是在还没有学好基础之前就放弃了。对此我经常很郁闷,感觉自己仅仅有一颗程序猿的心,却没有成为程序猿的命。而这节课的内容给了我很多的启发。 ## 1.语法不是学出来的,而是用出来的。 这和李笑来老师在《人人都能用英语》里所表达的意思是一样的。程序的本质也是一种语言,那么它必然有自己的一套语法结构,这些语法跟英语语法一样的枯燥乏味。不知道这里有多少人还能分清楚时态、虚拟语态之类的语法概念? 但是这似乎并不妨碍我们去用英语。在不断的阅读英文材料的过程中,语法知识似乎就自然的习得了,因为过去需要靠语法知识分析才能理解的句子,如今读完就理解了。这真是一个神奇的过程。那么这个道理是不是在编程世界里也一样呢? 高阳老师给出了肯定的答案:**不被使用的代码,是垃圾代码;不被使用的变量,是垃圾变量**。 从这个角度出发,一个合格的程序猿一定是一个实用主义者。从变量的命名中,我们可以看到,代码的意义不仅仅是被自己所用,还要被他人所用。好的命名方式,可以让程序设计者之外的人也能读懂这个代码。 好比 ```var start``` 就不如 ```var startTime``` 更能准确的表达含义。当然注释信息也可以很好的帮我们更好的理解代码的含义。但是给每条代码都加上一个注释信息,似乎并不是一个明智的选择。所以好的变量名大大提升了代码「用」的效率。 关于循环语句也是一样的道理,无论是 ```if``` 语句还是 ```for``` 循环,在实际的运用中,我们都需要从它们的功能和使用场景。比如,```if else``` 语句更适合于二选一的情况,而 ```switch``` 语句更适合多选一的情况。虽然 ```if else``` 也可以后面再加一个 ```else``` 来实现多选一,虽然 ```switch``` 也可以仅仅使用两个 ```case``` 来实现二选一。 ## 2.逻辑是可以从用的角度推导的 我们每天都在登录各种网站、页面和APP,但似乎从来没有想过它们是怎么实现的。当然作为普通用户来说,这并没有什么关系,但是对于致力于成为程序猿的我来说,思考这个问题就很有必要了。额,我又找到了一个之前学不好编程的原因了——这样的思考太少了。 通过对新大用户登录页面交互过程的推导,我终于搞懂了两个之前一直觉得很模糊的概念:**客户端**和**服务器端**。对于新大来说,我就是客户,那么我的个人电脑就可以称为客户端,而新大服务器为我提供了服务,满足了我的需求,所以叫服务器端。 在新大的主页上,当我点击「登录」按钮时,实际上我就发送了一个登录请求。显然这里我发送的对象是新大,那么必须由新大来对这个请求做出反应,此时新大的服务器端就登场了,它同意了我的登录请求,并给我返回了一个登录界面。这就完成了一次交互,也就完成了我跟新大的一次沟通,更直白点就是:我问一句,新大回复我一句。 然后,我输入登录信息并发送给新大,开始第二次的交互。然后新大服务器端做出判断,如果信息正确就返回给我后续的用户界面,如果信息错误就返回给我一个错误提示,如「用户名密码错误」。这样新大的服务器端就为我完成了第二次服务。以此类推。 这里也贴上本次的作业,请笑纳: ![](https://ws1.sinaimg.cn/large/006tNc79gy1fiq1m4jencj30zs0fydjj.jpg) ## 3.一点题外话 本来总结到此就应该结束了,但是本节课开头的那个女孩,给了我很多的触动。所以这里啰嗦一点题外话。我是一名机械工程师,大学学了7年机械,又工作了4年,得出的结论是「我不喜欢这行」,这确实很让人沮丧。 还依稀记得2013年,在完成论文等待答辩的间隙,我在网上报了个WordPress建站课程,目的是要做个淘宝客网站。几个月后,凭着所学的一点HTML、css基础,再加上几个模板,还真的把网站建立起来了,然后我注册了域名,还做了网站备案。后来发现,这网站离挣钱还早着呢,必须要学seo推广才可以。我还真的去学了,学「白帽」去写了一段时间的软文,虽然有了一点点流量却一直没有成交量,后来就没有后来了。 > 要不是现在又学编程,我是真的想不起那段经历的。 > 为什么又学编程呢?因为想转行去写代码吧,因为自以为喜欢代码吧。 > 那么我可以通过学习编程而转行吗?因为喜欢编程,所以就能做的更好吗?过去我的答案是肯定的。 但近半年来,随着在新大和得到平台的不断学习,我认识到「不喜欢这行」是个借口,是自己没有在本行业有所建树的借口。于是我又想起了毕业前导师的话:干一行爱一行。而我现在才有所领悟——痛的领悟:是先要干好一行,才能爱上这行。 > 所以我又重新思考了以上的问题。喜欢就能做的更好吗? 喜欢与否只是行动的原因之一,它不能保证结果。编程理论的枯燥程度并不亚于机械理论,反复「编程入门」的我对此深有体会。所以在编程的世界,我依然很可能会遇到跟现在一样的尴尬境地。 > 那么我要怎么做呢? 抛弃所谓转行的念头,至少是暂时抛弃。注意力应该放在具体的项目上,发现项目的乐趣,要给它赋予意义,然后全身心的投入进去,就像自己当年建站时做的一样。 编程和机械一样都是非常吃经验的,所以必须扎扎实实的积累经验。相信待积累几个成功的项目经验后,转行就只是顺势而为的事情。 编程和机械也是有区别的。编程的迭代速度更快,这就意味着在编程的世界里,要倒逼自己更快速的积累、更高速的成长,否则就要被淘汰。这也是我为什么想转行做程序猿的原因——追求成长,更高速的成长。 ================================================ FILE: homework/lesson3/zhaoxiaoxin.md ================================================ 作为小白,从JS的架构开始,我们也算头一波。感谢老师的指引,让我们建立起宏观的概念,形象化的认识。感谢老师,带领我们一路前行,打怪升级。 第三课的收获 1、学到了“命名后就要使用”的思想,学到了几种常用的语句,for switch等。 2、明确现在的重点任务就是,快速掌握JS的语言基础,练好基本功,后面才能不掉队。 3、了解了流程图的使用,明白了浏览器与服务器的交互流程。 做了作业才明白,为什么打开页面的时候,有时候会先出来页面的框架,后面才逐渐显示出图片。原来是因为,框架会在html中先传至浏览器,浏览器在解析的过程中发现缺少ass文件和js文件,然后再向服务器发出请求。 自己要注意,多做总结,多敲代码,加油。 关于如何命名,听了老师的课,知道了该如何去做。 跟着老师的课件,敲了两天代码以后,对此又有了新的认识。 这样做的根本目的是,为了方便阅读。 1、驼峰式的命名格式,是为了方便其他人阅读代码; 2、老师讲的两个命名要点,一是要有具体指向,可以从名字推导出更多的信息,另一点是,要明确what而不是how.这样做的目的,也是为了方面其他人阅读代码; 3、在写代码时,不同的内容之间,要用空白行隔开。 代码输出的内容,不同的内容之间,也要用分界线或者空白行间隔开。这样做的目的,也是为了方便别人阅读。 方便别人的同时,也方便了自己。 看见别人做的好以后, 一起学习,可以看到别人的作业。哈,上学的时候可没有这样的好处。 现在做完作业,看看其他人的,对比一下就可以看到差距。 之前流程图是用纸和笔画的。看了其他人的作业,有的是用软件,有的是用纸笔,但同样的纸和笔画图,可以看出每个人的用心程度。我的字太潦草了。 据说,看见别人能做到,就可以激活自己的镜像神经元。不知道是不是这样,反正我看完别的同学的作业,就自己重新打开画图软件,重新制作了一份。还加上了判断哈。 每天都有很多成长,每天都很充实。感谢老师。 ================================================ FILE: homework/lesson3/第三次作业 交互图.md ================================================ ##第三次作业 交互图 ###上课笔记: 1、nodejs是JS的运行时 2、变量:定义变量,给变量赋值 3、命名: >名字包含更多的信息 >要what不是how:var inputData & **var employeeData** 4、APP与服务器/浏览器与服务器之间的交互 >获取HTML文件 >解析HTML文件 >获取JS/CSS >更新页面/执行JS代码 ================================================ FILE: homework/lesson3/谢玉辉.md.md ================================================  看完了所有视频,然后回来这次作业,现在有了整体的概念。技术上的问题相信自己会很快熟练。 ================================================ FILE: homework/lesson4/Jaykey.md ================================================ ### 基础-第四课 记住什么? #### 函数的构造和调用 > 原则:没有调用的参数和函数,都是流氓参数、流氓函数。 #### 从实际应用到代码 第一步是拆分过程,讲一个“大事件”拆分成若干的小事情,只找其中必要的部分来做。 第二步,完成各个小的单元,写出各个小部分的代码。 第三步,汇总,形成工作流,排序,调用对应函数。 PS:做好每个小单元的设计和封装,才能在调用的时候更加方便和高效。好的函数是能够多次调用的。 #### 使用VUE来构建动态数据 ------ 小结:使用VUE的过程中要赋予对应的id值。 更新个人JS学习博客:https://github.com/JayGJianGuo/js-study-record ================================================ FILE: homework/lesson4/Risexie.md ================================================ 第四节课总结 === ### 最好的的时代 感谢老师为了照顾及学员进度而一再调节课程的内容,老师辛苦了。 说实话没有老师开设的这一门课程,我想我还是会去学习编程的,不管用什么方式。 曾经有人说过,这是一个最好的时代。在这个时代没有大型的战争,没有大型的冲突,我们可以生活得非常的安稳。同时互联网给我们提供了一个非常强大的外脑。 笑来老师说: > english +互联网=Almost everything 我们几乎可以从互联网上找到我们想要的一切信息。如果同时利用好搜索功能,我们甚至可以把互联网当作我们的记忆库,这可以帮助我们突破大脑记忆的上限。   在接下来,我们的整个世界都会朝着电子化发展。越来越多生活设备被加入电脑芯片,被自动化,被电脑化。如果我们想要和这个世界更好的相处,想要在将来这个高度信息化,电脑化的世界体验更多的可能,掌握如何跟电脑相处,这是我们都逃不掉的命运。 尽管网上的资源是如此多,但是对于一个小白来说,面对如此多的信息,首先我们无法甄辨他们的质量。其次更是因为知识的繁杂,我们更多不知道从何下手,就光是安装编程的环境都让我们足够头疼。再加上编程其实是实现我们人类想法的工具。如果没有编程的思想,我们最终都只能成为写代码的机器,为了编码而编码,哪这件事情没有任何意义。,他们都跟企业有着保密协议,没有办法将我们人类思考的精华从企业带到我们这里。还好我们碰见了徐老师,愿意为了计算机教育,从大厂出来帮助我们这些小白,在这里再一次表示我的感激!
### Function的三要素 在JS当中最为重要的三要素是:目标、方法和return。 1. 目标:我们需要明确调用的目标,来使用函数。 2. 方法:方法内容是一个函数的内核,选用好的方法来执行,能够提运行的速率。 3. Return:返回值是函数的结果,而这个结果有可能是另外一端函数的输入 ### 引入第三方库 在网页制作当中,如果仅仅是依靠HTML自带的语法格式,我们无法做出一些赏心悦目的网页效果。这个时候我们就可以使用第三方库的服务。 老师在直播当中就演示了如果引入VUE的服务,只需要加上库的来源URL。并在代码当中使用我们预定义好的数据,就可以让我们的静态网页“动起来” ### 如何将我们要执行的任务转化成代码? 计算机能够处理这么复杂的任务,看似不可思议。飞快的运算速度,更加会让我们误以为计算机是足够的聪明。其实不过时将一个复杂的大任务,逐个拆分,拆分到计算机可以执行的程度。 在课堂当中,老师当场示范了如何让计算机做出“报数”这个动作。老师采取了几种不同的方法。 1. 轮流 直接写出五个独立的报数`function`,然后再用一个`function`把这个他们五个都串起来,再直接输出。这其实就是一个拆分工作的例子,将“5个人报数”这件事情拆分成5次的“单人”报数,然后再依次执行。 2. 通知 在第一个`function`当中嵌套第二条,因为接下来的每条函数都是层层嵌套的,所以只要执行第一条。自然就会不断执行,直到结束。感觉有点像多古诺骨牌,在每条函数当中都加上了“触发”机制,这样子在输出的时候就不用重复“输出”命令。  
### 厨房的工作流 在一开始,我们需要做众多的准备工作:(`prepare`),扫地、洗碗等等,而接下来的工作是建立在这些准备工作之上的,所以我们必须要对准备工作是否完成加以判断(`ture`)。(这时候可以用到布尔值) 第二部我们需要去买菜:(`buyFoods`),而其实“买”这个过程对应到流程中就是定义字符串`food`,并最终`return`出来,好让我们有材料可以“做菜”。 第三部便是我们做菜的核心流程,但首先我们需要“拿“到菜来加工,才能最后得出色香味俱全的菜肴。所以要在第三个`funtion`当中使用到刚才第二部`return`出来的数据。 *当我们已经完成了任务的拆分,这个时候只要再把他们按照一定的条件串起来,就可以完成一个大工作。这其实就是编程!* 最后构建`startWorkFlow`,来将以上三部组合到一起。但是只有准备工作做好了,我们才能去买菜,才能开始做菜啊。所以这个时候需要一个`if `函数。 如果准备工作做好了:`ture`我们就继续开展,否则:`else`就是没有准备好。 然后我们使用第二部`return`出来,也就是买到的菜给第三部,执行它,然后再把第三部中`return`出来(也就是做好的菜)摆上桌子。我们就大功告成了。 *这个例子的确让我对后台数据的调用有深刻的理解。想起来老师曾经说过新生大学登陆后台,会对用户的数据进行5次的哈希运算。这个过程其实以上的例子有点相像。需要不断调用哈希出来的结果然后再一次哈希,最后才可以登录。* ================================================ FILE: homework/lesson4/WuGaoxing.md ================================================ # 没有作业就传个函数相关笔记 PS:没有作业 重点是复习 回顾: 函数/function 前端- 让数据动起来 对象、JSON对象、JSON格式 王云飞的勇气 还有幼儿园班 JS中函数特别的简单 ,函数是JS的一切 定义函数 function counter(count){ count = counter+1; retun count } 调用函数 counter(1) 函数调用有: 顺序调用、嵌套调用 函数是一个处理的封装 、一个处理的单元 做菜函数 很是丰富 可熟练掌握: ## W3school中学到的函数 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。 函数就是包裹在花括号中的代码块,前面使用了关键词function: function functionname() { 这里是要执行的代码 } 在使用 return 语句时,函数会停止执行,并返回指定的值。 调用带参数的函数 在调用函数时,您可以向其传递值,这些值被称为参数。 这些参数可以在函数中使用。 您可以发送任意多的参数,由逗号 (,) 分隔: ================================================ FILE: homework/lesson4/jianglin.md ================================================ ### 姜琳第四次课总结 #### 今天学到了什么 今天的重点是函数的定义和调用。要慢慢在应用中体会吧。老师说JS没有C++函数使用复杂,不过我都不是很记得了。 #### 笔记 iterm 终端编辑器 调用关键点: 1. 需要明确调用目标(对象) 2. 需要给予目标一些信息 3. 目标处理完会返回结果 函数是黑盒,不需要把每个函数内部搞清楚。函数是一个处理的封装,是一个处理的单元。函数名、参数、返回值:三要素。 新建一个文件要先保存。 多看issues Vue,可以学一点的第三方库。这段没太看懂,对html了解得太少了。 visio什么的那个编辑器,最后一个图标里都是插件,可以搜索使用。 JavaScript format 编辑器主题 主题: 回顾、函数、前端-让数据动起来、对象、JSON对象、JSON格式 ================================================ FILE: homework/lesson4/liujuanjuan1984.md ================================================ # JS编程入门 第四课 _课堂笔记 10:25-12:00_ ## 课程内容: 回顾 函数function 前端-让数据动起来 对象,json对象,json格式 ## 一、回顾 **终端操作の一个好习惯**:打开终端,有一个默认路径。你要先查看下当前文件夹在哪儿。采用ls(mac)或者dir(windows的cmd终端)命令,查看是不是。如果不是,采用cd命令行逐步进入工作文件夹,才能开始工作。 **知道自己在哪儿,知道自己要去哪儿,才开始工作。** 要干嘛?_目的性要强。_ **终端操作の一个好工具**老师在mac上用iterm,这个mac版的终端编辑器,可分屏非常好用。老师有接近8年没有碰过windows电脑,所以给不出windows的工具建议。 从github下载的项目才有.git隐藏文件。 **我们正抱着一座金山,珍惜这次的学习机会!**: 第三节课也是复习。老师很担心同学们上到第3、4节课就忘掉。 要敢问。尤其是在学习期间。 第一次在新大讲课。在阿里,是无法在外面讲课的。(竞业限制) 外面的课程很多讲课是很low的……(难不成是有知识隔离?) 作业量太大,作文式没办法交给别人来做。会挨个看,周末搞定。(老师好认真,好负责>_<) ## 二、函数function **函数,非常简单。**依然用类比的方式,从实际生活中的调用,代入函数的概念。 我要买瓶可乐。 我要理发。 我要打印。 生活中调用的共性,对象(向谁),目标(想要什么)+要求(理成什么样),结果。 调用的关键点: 1、需要明确调用的目标(对象) 2、需要给与目标一些信息 3、目标处理完会返回结果 **没被污染过的大脑,更有优势。** 没学过编程的人,跟着老师更有优势。大脑没有被污染过。 学JS,适合没学过代码的人来学。脑子是空的,接受起来非常快。 学过C++、面向对象的人来学js,(老师自己刚学js,也觉得js怎么那么乱) 第一个js项目,干得特别蠢,写成面向对象;半年后才缓过劲。后来又把整个代码改过来了。 尝试接受新的事务。 **JS的函数,是JS最首要的,超越了对象。** 调用者 函数黑盒 →调用函数,并携带信息 返回结果← 大量使用内置库、第三方库 知道要什么,给他什么,等他返回结果。 函数定义很简单。一笔带过。自己看书。 **一切被定义过的东西(对象,函数,变量),没使用过就是垃圾代码。** 有脚本专门去扫这些没使用过的。 定义了,要占内存的,没参与计算的东西消耗内容。 定义就是为了使用。 **函数使用的实例:报数、做饭** 报数-轮流报数 我们如何把我们思考的东西,变成代码? 这是学习编程中需要去建立的一种思维:我们想要的东西,怎么演变成代码。 学习编程思想。 现实需求映射成代码,这就是编程思想。 新建一个文件,第一件事是保存。保存为.js文件,这样写代码的时候,才会有对应的格式。_因为这个小技巧,我记住了王云飞同学,哈哈。_ _函数这部分,我就跟着课程直接写了sample代码,果然只有自己一起编写,才能产生疑问!_ _敲下与函数的第一行代码时,我居然没有准确拼写funciton这个单词,好在写2遍自然就记住了。多写代码,多调试,才是学习的正途。_ 我产生了2个疑问是: 1、定义报数函数a时,函数里面使用了函数b,但函数b还没定义,为什么没有报错? 提这个问题是因为,之前先定义obj并引用变量,会出现变量未定义的情况。 何伟同学说,虽然JS是逐行执行的,但函数的定义在一开始就预加载了。 2、定义报数函数a时,为什么没有参数? 老师说,没有参数和没有return,也是一种参数和一种return。 这么哲学的回答方式,我居然能懂。 _就像面对多重选择,不去选择也是一种选择。_ ## 三、让前端动起来 关键词是:**vue** 一个看上去很叼的第三方库。 在某个网页拷贝代码到头部 在body那里加个id
再去某个网页拷贝多行代码到script部分 用双重瓜括号括起来,去调用

{{personObj.name}}

vue官网: https://cn.vuejs.org/v2/guide/ _这节内容,我在hellojs的index.html文件尝试了,并成功了,但当前还不懂。完全照搬而已。_ ## 四、理解一下,如何拉老师项目的更新 //以下操作在终端进行,我是cmd,需要进入到项目目录下 //配置remote数据源,仅配置一次即可,后面每次不用再配 > git remote add upstream xxxx //切换至master分支下,我好像不用,因为总是在这个分支 > git checkout master //取上游数据 > git fetch upstream //进行主节点与上游节点数据的合并,如果我本地没有更新,则不用吧? > git merge upstream/master //假如我确实需要提交,则git push origin master即可,当然我在此之前需要git add 和git commit才行 我的疑问是:为啥不是git pull? 度娘答: > 将远程存储库中的更改合并到当前分支中。在默认模式下,git pull是git fetch后跟git merge FETCH_HEAD的缩写。 > 更准确地说,git pull使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支中。 使用--rebase,它运行git rebase而不是git merge。 ================================================ FILE: homework/lesson4/panyong.md ================================================ # 第四节课 小结 首先,谢谢老师,第四节课本应8月24日就关闭,没想到8月27日竟然还可以看到。也发现之前听过一次的内容,竟然全忘了,就算去看PPT也回忆不起讲的内容了。于是,拿起手机边听课,边用电脑做文字笔记。再次听课,收获很大。 这堂课,最大的收获是,通过案例“厨房办一桌酒席工作流程”,理解了编程的思路,这个思路对实际问题到代码的转换有指导意义。 笑来老师说教是最好的学,想象自己将要讲课时,去听课,又体会到了新的收获,发现老师教的非常好。老师教函数时: 1)先聊,实际生活场景中的“调用”:买可乐,理发,打印。 2)再聊,代码中函数的定义与调用:非常简单。 3)最后,演示了实际生活场景到程序代码的映射:报数,厨房办一桌酒席。 一切都变得简单、自然。蕴含的编程思路对解决实际问题有指导意义。不像一般的将函数的课程,就只有语法知识,没有解决问题的编程思路,听了也就只是听了,对运用没有指导意义。 下面是老师课程的教学流程: ## 初学git终端命令使用注意事项 先ls或pwd,知道当前在哪里,确保进入到自己的工作目录。(知道自己在哪儿,知道自己去哪儿,然后再开始工作) ## 函数(function) ### 1、生活中的“调用”讨论 ``` 我要买瓶可乐。我要理发。我要打印。 “调用”的关键点: 1)明确目标(如:理发)。 2)给予目标必要信息(如:发型要求)。 3)目标处理返回结果。 ``` ### 2、函数的定义与调用 ``` //定义 function counter (num){ num++; return num; } //调用(执行)函数 counter(num); ``` ### 3、生活场景映射到代码的思路 #### 报数 - 轮流 ``` 报数规则: 1)从左往右,轮流报数 2)我说“开始”,执行报数。 映射到代码: 1)报数代码 function personC() { console.log('3'); } 2)我说“开始”,执行轮流报数 function startSoundOff(){ personA();personB();personC();...... } ``` #### 报数 - 通知 ``` 规则:第一个开始报数,第一个报数后通知下一个报数。 映射到代码: function personB() { console.log('2'); personC(); } function personA() { console.log('1'); personB(); } function startSoundOff(){ personA(); } ``` ### 4、厨房的工作流程:办一桌酒席 ``` //准备工作 function prepare() { console.log('磨刀。。。扫地。。。洗碗。。。劳动最光荣!'); return true; //返回值的方式,告诉调用者,我准备工作完成状态。 } //买菜 function bugFoods() { console.log('去买菜...'); var foodsList=['egg','fish','meat']; return foodsList; //买完菜了,返回菜 } //做菜 function cooking(foodsList) { console.log('开始做菜'); console.log(foodsList); var list = ['西红柿炒蛋','红烧肉']; return list; } //startWorkFlow,是做一桌菜的的流程,也是编程的思路,老师讲的非常好,而且例子举的非常可口。 //老师的讲解流程是,先讲解prepare(),buyFoods()等,再在startWorkFlow()中去调用。 //其实,也可以先讲解startWorkFlow(),先理清工作流程,然后再进入到prepare(),buyFoods()等具体实现每一个函数的功能。 function startWorkFlow() { //准备 var result = prepare(); if (result) { //买菜 var foodsList = buyFoods(); //做菜 var list = cooking(foodsList); //上菜 console.log(list); } } // 干活啦~~ startWorkFlow(); ``` #### VUE让数据动起来 以styde/lesson2/my_personal_info_page.html为例,改变网页中的数据。 1、引入vue ``` ``` 2、vue的使用 ``` var app = new Vue({ el: '#app', data: { person: xiaoming } }) ``` vue这一部分,暂时没管,后续再研究。 #### Visual Studio Code 的用法 这要演示了插件的扩展安装(`ctrl+shift+x`)与使用(`ctrl+shift+p`)。 ================================================ FILE: homework/lesson4/taobao.md ================================================ # lesson4_theFourthHomework_codingIdea There no homework about lesson4, but I know I should and must do this. The goal of this lecture, the prof would like to share the coding idea which is about thinkking code. The most important point is make your thinking in code. If possible, let it satrts with coding thinking and type the code later. For the two example during the lecture, the first one, instructor gave three sample codes, and explained first two. I 100% understand those two ideas and deep meaning. However, when I saw the sample3.js code. I got one weak part understanding which is about Object and its property. Moreover, I have more deep understanding about var and defination, and I know that practice is the sole criterion for testing truth. Then when lecture hant out the second example about prepare for one meal. The instructor point me the code thinking and I make connect with my coding before. Before this course, I studied and wrote code in University, I do not know why prof asked us write like that. Maybe I did not pay attention during the course. However, after I type the kitchen-sample.js code, and I replayed the video. I know more than before. I believe my code is more meaningful and clearly. In conclusion, this lecture help me lots of thinking about code, and it will change my coding write style. I prefer make all logic first on paper or something then type them in code. --- 终于听到直播了, 报数的例子问题不大,对于使用对象进行报数的 sample3.js 看过后已经理解,但是更倾向于 sample1.js 和 sample2.js 的写法,当然相信 sample3.js 的写法也是会有用的,现在没有用到罢了。 做菜的例子上课听的时候,第一反映是懵逼的,后面看代码的时候发现老师的写法让很多东西进行了有效的使用而不是重复的造轮子,之前在校写的时候很多数据我都是复制粘贴,感觉简单易懂,但是面对复杂的情况下,function 使用过多会造成很多的损耗(人力,维护)。 --- 1. visaul stiduo 真好用 formate 插件,还有好多插件,之前在用 Atom, 里面也有插件但是从来没用过,教授恨不得让我们用notepad 写代码。 2. 老师上课提到的 扫描没有被使用过的代码的脚本 可以推荐吗?(还不能自己Google 哪个最好) ================================================ FILE: homework/lesson4/xiaochaoge.md ================================================ # 第四课 关于函数与调用 [TOC] ## 函数有啥好的 同样是赋值语句的输出,有函数和没有函数的差异在哪? 我们看一个例子: ``` var startSoundOff = [1,2,3,4,5,6]; for (var i = 0;i < startSoundOff.length; i++){ console.log(startSoundOff[i]); console.log(\n); } ``` ![函数与调用](http://ovdtbcicu.bkt.clouddn.com/函数与调用.png) 同样的,我们用函数实现这个过程: ``` function personA() { console.log(1); } function personB() { console.log(2); } function personC() { console.log(3); } function personD() { console.log(4); } function personE() { console.log(5); } function startSoundOff() { personA(); personB(); personC(); personD(); personE(); } startSoundOff(); ``` ![函数与调用1](http://ovdtbcicu.bkt.clouddn.com/函数与调用1.png) 单纯来看,除了代码变长之外,没有任何改变,但是真的是这样吗? > 现在假想一个情况出现了:**程序报错了,你该怎么办?** 对于第一段代码, for 语句循环,如果一处卡死就不执行。你不得不开始重新认真阅读你的每一个变量名、全半角符号以及判断语句,因为任何一种情况都可能出错。但是感谢现在的编辑器,报错提示会明确告诉你卡死在哪一步了,但是故障排除很困难,更可能的情况是,你修改了代码,信心满满的以为,自己的 bug 修复了。最后的结果残酷的告诉你,虽然你解决了一个旧错误,又产生了新错误。现在的代码只有三行,错了可以重新写。如果项目比较大,代码是三千行,你确定要重新写吗? 对于第二段代码,是不是每个数字输出的过程都被“分割”开了,也更容易能根据每个数字确定哪里出错了,更容易找到排出故障,正确的代码不会受到任何影响,你只需要维护和修订对应的“出错函数的区块”,是不是更方便了呢? 如果你是网站的协作者,哪个代码的再编译性、借鉴性更强呢?你会选择用谁的代码与你协作呢? 函数的除了能更快的查错以外,还有第二个特点:**调用更方便**。 同样是这两段代码,如果第一段代码在执行后的第 5000 行,我需要使用变量`startSoundOff`; 同样的情况,如果第二段代码在执行后的第 5000 行,我需要使用变量`startSoundOff`。 > 哪段代码的逻辑更容易出现问题 ? 其实使用函数的好处在于**分块**,一块一块的东西更容易去理解和消化,也更容易去维护。 ## 函数自 high 玩法 —— 狠起来自己的脸都打 函数还能怎么玩? 先看看函数的结构吧 ``` funcition 变量(){ 赋值语句&条件判断; } ``` 这里的条件判断可以是变量本身。坏处是,搞不好,变量调用自己,进入死循环,把自己崩溃掉,用自己高效的特点狠狠的打了自己的脸。 ``` var person = 1; function startSoundOff() { person = person + 1; console.log(person); startSoundOff(); } startSoundOff(); ``` 结果数据溢出了,因为执行完`console.log(person)`后,会直接输出一个数字,再循环执行`startSoundOff()`,重新进入函数体再 + 1 ,再输出一个数字,再循环执行`startSoundOff()`,最后从函数体中跳不出来,直到数据崩掉。 ![数据溢出](http://ovdtbcicu.bkt.clouddn.com/数据溢出.png) 那怎么解决呢?让函数自己判断什么时候执行结束,用 if 语句就可以了! ``` var person = 1; function startSoundOff() { person = person + 1; console.log(person); if (person < 100){ startSoundOff(); } } startSoundOff(); ``` ![避免数据溢出](http://ovdtbcicu.bkt.clouddn.com/避免数据溢出.png) 现在数据执行到第 100 个数字,就会停止执行啦。 ## 函数高端玩法 —— 前后调用 创建一个工作流,让函数之间动起来 ``` function prepare(){ console.log('磨刀--扫地--洗碗--劳动最光荣'); return true; // 返回一个值说明这件事已经干完了 } function buyfoods(){ console.log('去买菜'); var foodsList = ['egg','meat','tomato']; return foodsList; // 买完菜交差 } function cooking(foodsList){ console.log('开始做菜'); console.log(foodsList); var list = ['西红柿炒鸡蛋','红烧肉']; return list; // 炒完菜回来交差 } function startWorkFlow(){ var result = prepare(); if (result) { // 如果 result = prepare 为 true ,则执行。 var foodsList2 = buyfoods(); // 如果买完菜,把菜给 foodsList2 去处理 var list = cooking(foodsList2); // cooking是个函数,它处理的不一定是 foodsList 这个变量,也可以是foodsList2 这个变量 console.log(list); } } startWorkFlow(); ``` 关键点我都写在注释了,但是最难理解的莫过于: > cooking 是个函数,它处理的不一定是 foodsList 这个变量,也可以是foodsList2 这个变量。 我给你举个例子好了,还是做饭这件事,今天买的土豆和昨天买的土豆应该是不一样的,但是今天和昨天吃的菜都是炒土豆丝。我们的变量是土豆,而函数就是炒土豆丝的办法,**变量会变,但是对于确定的函数,计算的方法是不会变的。** ## vue 库 其实把各种库,当成别人写好的函数。无论是外部库还是内部的库,都是为了更好的输入、储存和处理。 vue 库也是这样的函数,用这样的函数有什么好处? 如果是赋值语句,一旦一个变量被赋值,这个变量就是确定的,除非你给它重新赋值。但是一个变量程序中又不是只被使用一次,意味着我们需要手动修改掉这个变量的所有值,还要改掉有冲突的值。能不能做到只改一个值,就能做到改掉赋值语句中所有的数值呢? 我以vue 库官方的例子来说吧 html 部分的修改 ```

{{ message }}

``` JS 部分的修改 ``` new Vue({ el: '#app', data: { message: 'Hello Vue.js!' } }) ``` 这里例子中,如果我在`JS 部分`修改`message: 'Hello Vue.js!'`,那么`html 部分`的所有含`message`的部分都会修改,那么这如果是新生大学的客户端呢? 我作为用户登陆,相当于给一个函数赋值 ,JS 读取这个值对不对,给出我们对应的 `message` ,你看看,是不是能写出和用户交互的动态网页了呢!当然,别着急,一段段的代码就是逐步成长的脚印。 现在看看这张图,恍然大悟! ![浏览器、服务器交互图](http://ovdtbcicu.bkt.clouddn.com/浏览器、服务器交互图.jpeg) ------- 小超哥 2017 年 8 月 31 日 ================================================ FILE: homework/lesson5/GaoXianfeng.md ================================================ ## 第五课总结 ### 函数立即返回(在函数中 return 一个结果) 生活中例子映射立即返回函数: 1. 老板打电话给秘书,要求查一下明天早上最早一班从北京飞上海的飞机时间,并嘱咐秘书此事比较着急,不挂电话,马上查询航班信息,查到后将结果告诉他; 2. 秘书收到通知后,马上查询航班信息,将查询到的航班信息告诉老板; 3. 老板与秘书挂断电话。 代码事例: ``` function checkFlightSchedule() { console.log('开始查询航班信息'); var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'shanghai', }; return scheduleInfo.start; // 立即返回函数结果 } var startTime = checkFlightSchedule(); console.log(startTime); ``` ### 回调函数(间接返回) 生活中例子映射回调函数: 1. 老板打电话给秘书,要求查一下明天早上最早一班从北京飞上海的飞机时间,并嘱咐秘书此事比较着急,不挂电话,马上查询航班信息,查到后将结果通过***微信***发送给他; 2. 秘书收到通知后,马上查询航班信息,将查询到的航班信息通过微信发送给老板; 3. 老板与秘书挂断电话。 代码事例: ``` function checkFlightSchedule(callback) { // callback 这个函数做为参数传入 var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'shanghai', }; callback(flightSchedule.startTime); // 函数内并没有通过 return 将结果直接返回 } function callback(startTime) { console.log(startTime); } checkFlightSchedule(callback); // callback 是函数结果返回通道,通过此通道获取函数最终结果 ``` callback 函数 === 微信 === 间接返回信息的通道。 ### 异步 生活中例子映射回调函数: 1. 老板打电话给秘书,要求查一下明天早上最早一班从北京飞上海的飞机时间,查询航班信息,查到后将结果发送给他, 挂掉电话; 2. 秘书收到通知后,查询航班信息,将查询到的航班信息通过微信发送给老板; 代码事例: ``` function checkFlightSchedule(callback) { setTimeout(function() { var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'shanghai', }; callback(flightSchedule.startTime); }, 5000); } function callback(startTime) { console.log(startTime); } checkFlightSchedule(callback); // callback 为函数结果返回通道,通过此通道获取函数最终结果 ``` setTimeout(); 函数为 JS 内置函数; 运用 setTimeout() 函数模拟老板与秘书通完电话后,双方各自处理自己事情场景,5秒钟后构造 scheduleInfo 变量,并调用 callback 函数获取 startTime 值(60-67行代码); ### 变量提升简单总结 1. 所有声明都会被提升到作用域顶端; 2. 同一个变量只能声明一次,其他声明会被忽略; ================================================ FILE: homework/lesson5/JayChen.md ================================================ ### 代码分析 ```Javascript *1 function output(name){ *2 console.log(name); *3 } *4 *5 var name = 'Hello, JS'; *6 output(name); ``` * 第一行的name是定义output函数时设定的参数 * 第五行的name是要把 'Hello, JS'赋值给它的变量 * 第六行的name是调用output函数时喂给它的参数,在这里就是第五行赋值后的name > 这三者在赋值后值相同,但是含义不同;第一行是在定义函数时设定的参数,是一个通用概念的参数,第五、六行的name分别是被赋值的变量和赋值后喂给函数的参数;他们可以使用同一个名称,或者第一、二行的name指代的参数名称与第五、六行的name赋值的变量名称完全不同,都是可以的。 ================================================ FILE: homework/lesson5/Jaykey_Guo.md ================================================ ### 基础-第五课 画顺序图,看到顺序图就能翻译出对应的代码。 ![](https://ws1.sinaimg.cn/large/006tNc79gy1fpqbbsuh75j30zk0k041a.jpg) 分步骤来拉取数据。 ------ ![](https://ws4.sinaimg.cn/large/006tNc79gy1fpqbcznltbj30zk0k0428.jpg) ##### 前端的工作,三者之间的关系: > 1. 用户与HTML的交互 > 2. HTML与JS代码的交互 > 3. JS代码与服务器的交互(数据交互) ##### 函数的调用 输入什么,输出什么,不同函数实现不同的输出。对外界**参数**进行处理。 ##### 切分流程,最小的可用单元 用不同的函数来完成最小的工作,组合不同的函数来完成一个较大的任务。小套路的叠加,变成一个大套路。 ![](https://ws4.sinaimg.cn/large/006tNc79ly1fpqbi8hqhlj30zk0k041n.jpg) #### 立刻返回 ```javascript function checkFlightSchedule() { console.log('开始查航班信息'); // 模拟构建航班的时间信息 var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'hangzhou' }; return scheduleInfo.start; } //--------------------------------------- // 调用立即函数checkFlightSchedule var startTime = checkFlightSchedule(); console.log(startTime); ``` ##### 回调(间接返回) ```javascript function checkFlightSchedule(callback) { console.log('开始查航班信息'); // 模拟构建航班的时间信息 var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'hangzhou' }; callback(scheduleInfo.start); } //--------------------------------------- function callback(startTime) { console.log(startTime); } // 调用函数checkFlightSchedule,并塞一个回调函数以获取结果 checkFlightSchedule(callback); ``` 通过callback作为返回通道来反馈,不是通过一个函数直接反馈,而是通过一个媒介来反馈。 *函数中的参数,和外界的参数没有关系。* ##### 异步(回调的一种方式) ![](https://ws2.sinaimg.cn/large/006tNc79gy1fpqbtvjrm4j30zk0k00ue.jpg) ```javascript function checkFlightSchedule(callback) { console.log('开始查航班信息'); setTimeout(function() { // 模拟构建航班的时间信息 var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'hangzhou' }; callback(scheduleInfo.start); }, 5000); } //--------------------------------------- function callback(startTime) { console.log('通过反馈通道获得了信息'); console.log(startTime); } // 执行查询函数 checkFlightSchedule(callback); ``` 对异步调用的个人理解: ```javascript setTimeout(callback, 5000); ``` ![](https://ws3.sinaimg.cn/large/006tNc79gy1fpqc2kpfbsj30ai092t98.jpg) 上图中的代码块中function的部分其实就是对应上面代码中callback的部分。 主函数是checkFlightSchedule(callback),辅函数是callback(startTime)。主函数中定义了对应的参数,也调用对应的辅函数,而辅函数调用了主函数中定义的参数,来实现需要的完成功能。 两个函数之间是交叉的关系,一步一步执行。 ------ 搜索了之后发现,js的异步调用是由于js的单线程的性质,在调用不同地方的参数的时候会出现堵车,所以通过对应的时间控制来等待前面的数据传输,之后再执行后面的操作。 一个生活的场景转换成代码之后,中间的差距在于对应的方法和方式不同,也就是要在其中找到机器如何理解这个事情,简单的一句“你等一下,我准备好告诉你”,在js中就是异步调用的方法。 ================================================ FILE: homework/lesson5/LiaoYuemin.md ================================================ ## Homework of Lesson 5 ### 什么是函数? 我理解的函数就是一个打包的代码块,可以重复使用。 函数的结构:函数由关键词function,函数名,参数(小括号里的变量),函数体(花括号里面的代码)构成,即: ``` function functionname(参数){ 函数体 } ``` 函数的三要素:参数判断,逻辑处理,返回结果 ### 代码分析 ``` function output(name) { console.log(name); } var name = 'Hello,JS'; output(name); ``` 第一行代码里面的“name”,是名为output的函数的参数。这里的参数就像我们在解方程式时候的X,Y一样,是用来表明函数的逻辑关系的变量,不是实际的值,所以是可以更改的,即为形参。 如将name改成tittle: ``` function output(tittle) { console.log(tittle); } var name = 'Hello,JS'; output(name); ``` 整段代码运行的结果依然是“Hello,js”。 形参的作用在于接受调用该函数时传递的参数。 但是需要注意的是,第一行的“name”和第二行里面的“name“,必须有相同的变量。如果这时候我把第二行的”name“ 改成”B“,就会提示B is undefined,代码无法执行。这时因为改成实际的值后,函数将没有可以接收实参的地方,所以在调用函数的时候不会输出实参的值。 第五行代码里面的”name“是新定义的一个变量,并把”Hello,JS“ 赋值给了它。更改赋值会影响代码最终运行的结果,如: ``` function output(name) { console.log(name); } var name = 'Lesson5'; output(name); ``` 实际输出的结果变为“Lesson5”了。 第六行代码里面的“name”相当于是是把name这个变量传给output 函数,相对于第一行代码中的“name”这里的“name”是一个实际代入的参数,有确定的值,是实参。 值得注意的是,第五行和第六行的“name”都是是可以更改的,但是必须保证名字一致,如把五六行的“name”改成“tittle”后: ``` function output(name) { console.log(name); } var tittle = 'Hello,JS'; output(tittle); ``` 输出结果依然是“Hello,JS”. 假如我将第二行的代码里面的name改成一个实际的值会发生什么呢? ``` function output(name) { console.log(‘Lesson5’); } var name = 'Hello,JS'; output(name); ``` 实际输出结果发生了变化,变成Lesson5了。 因为就整段代码而言,实际先执行的应该是最后一行代码,即调用函数output。当第二段代码更改后,函数内部的逻辑发生了变化,这时函数的意思是无论你传入何种参数,都会打印“Lesson5”这个结果。所以即便是第五行代码里面的变量name的赋值并没有发生变化,整段代码的运行结果也会随着函数代码的变化而变化。 ### 立即返回 ``` function checkFlightSchedule() { console.log('开始查航班信息'); var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'hangzhou' }; return scheduleInfo.start; } // 调用立即函数checkFlightSchedule var startTime = checkFlightSchedule(); console.log(startTime); ``` 立即返回,是指调用一个函数它会立即返回结果。类似于买东西时,我给你钱,你有现货(return)直接给我货,是信息的即时返回。 上面这段代码的意思是调用一个名为scheduleInfo的函数,函数直接将运行返回结果:8/23 8:00 最后两段代码也可以直接写成 > console.log(checkFlightSchedule()); 输出的结果是一样的。 需要注意的是,这里的函数需要有return具体的值。如果没有return的值或者return值为空,代码最终执行的结果将是undefined。 ### 间接返回 ``` function checkFlightSchedule(callback) { console.log('开始查航班信息'); // 模拟构建航班的时间信息 var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'hangzhou' }; callback(scheduleInfo.start); } function callback(startTime) { console.log(startTime); } checkFlightSchedule(callback); ``` 间接返回的意思就是,函数调用者并不是立即拿到结果。类似于买东西时,分店里没有货了,顾客说,那你用顺丰邮寄给我。这里的顺丰就是返回通道,放在上面这段代码里,就是callback这个回调函数。 把一个函数作为实参传入另一个函数内部,并在这个函数内部调用,这个被调用的函数就是回调函数。 这段代码实际运行顺序是:先运行的是最后一行,也就是调用函数checkFightSchedule.然后将callback这个函数作为实参传入函数内部,函数开始运行。先是console.log('开始查航班信息'),然后调用函数callback,并把scheduleInfo.start作为实参传入函数,即代码实际执行的是console.log(schedule.start),即'8/23 8:00'。 ### 异步函数 异步是相对同步而言的,同步就是指当一个函数被调用时,它需要把函数内部所有的代码都运行完了,返回调用者需要的值后,下面的代码才能继续运行。 假如函数里面的数据运算非常庞大,同步调用就意味着调用者必须等待很长一段时间,等被调函数全部运行完下一步代码才能执行。 而异步函数就解决了同步函数导致的代码执行效率问题。它相当于是设置了一个函数返回通道,在调用函数时函数内部代码执行完毕后,通过这个通道传回相应的结果。而在函数内部代码执行的时候,调用者不需要等待,代码可以继续执行下去。 ``` function checkFlightSchedule(callback) { console.log('开始查航班信息'); setTimeout(function() { var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'hangzhou' }; callback(scheduleInfo.start); }, 5000); } function callback(startTime) { console.log(startTime); } checkFlightSchedule(callback); ``` SetTimeout,即定时器。最初看到这个代码的时候很不理解,为什么setTimeout不用定义就可以直接使用,后来查了一下资料大概知道它其实是一种内置方法,不需要声明就可以直接用。这里通过它实现了异步函数调用。 > setTimeout(code,millisec) > 两个必须的参数:一个调用函数时需要执行的代码串,一个是执行前的等待毫秒数。 上面的代码意思是5s后再执行callback这个回调函数。我们在这段代码下面再增加一段代码,方便理解这个定时器的作用。 ``` function checkFlightSchedule(callback) { console.log('开始查航班信息'); setTimeout(function() { var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'hangzhou' }; callback(scheduleInfo.start); }, 5000); } function callback(startTime) { console.log(startTime); } checkFlightSchedule(callback); function setOut() { console.log('立即出发'); } setOut(); ``` 整段代码运行结果如下: > 开始查航班信息 > 立即出发 > 8/23 8:00 从结果我们可以看到在打印“开始查航班信息”之后,setTimeout中的代码并没有立即执行,而且也不是等待5秒后执行后,再执行prepare()函数。而是先执行了prepare函数,再等待5秒后再执行异步任务。 也就是说**异步任务是会在主函数运行之后再运行**的。本来按照逻辑,应该是先查航班信息,查到出发时间后再立即出发,但是因为setTimeout方法的这个特点,最后输出的结果出现了混乱。因此在用setTimeout的时候需要格外小心。 ### 最近学习的感受 最近学得有点吃力。单独拆一下代码好像都懂,但是要自己写就不是一回事儿了。大概还是练习不够。 一直在赶作业,马上第七节课了,现在才在做第五节课的作业,有点担心之后能不能跟得上。 但是老师一直在说第五节就是JS最难的地方,这个搞懂了就搞定了JS,所以有时也会莫名有种自信:不就是一节课的事儿吗? 昨天单位调休,在家敲了一天代码,总算是把做菜流程捋了一遍。主要是函数里面又有函数,看着看着就懵了!下来接着看,接着敲。 在上这门课之前,我一直宣称的是和计算机无缘,对代码毫无兴趣。其实现在也算不上有了兴趣,毕竟还有很多东西没有搞明白,但是我已经坚持学了三周多了,并且现在还没有放弃的打算,这真的是一件神奇的事情。 谢谢老师和同学的陪伴! 继续加油。 ================================================ FILE: homework/lesson5/LiuShengsi's homework of lesson5.md ================================================ 代码第一行的name是所定义的output函数的形式参数,用来告诉计算机“我这个函数有一个参数,你可要记住了”。 第五行的name则是定义的一个名称是“name”的变量,并且这个变量被赋值为“Hello,JS”。 第六行的name是刚刚定义的“name”变量被当成是output函数要执行需要的实际参数传给了output函数。 定义函数时形参取的名字是否和后来传给函数的实际参数一样都没有关系,只要传给函数的实际参数是已经定义过的就行。 ================================================ FILE: homework/lesson5/Risexie.md ================================================ # 第五节课总结 ### 代码差异 ```js 1. function output(name) { 2. console.log(name); 3. } 4. var name = 'Hello,JS'; 5. output(name); ``` - 第一行的name表示的是`output`这个函数使用了名为name的变量,又因为这个函数的内容是输出name变量的内容。所以从整体来看,`output`函数的作用就是把输入的变量的内容输出出来。无论这个变量的名字是什么。 - 第四行的`name`是内容为“Hello,JS的“一个变量。 - 第五行的`name`是刚刚定义的变量。 ```Javascript 1.function output(qwer){ 2. console.log(qwer) ; 3.} 4.var qwer = 'Hello,JS'; 5.output(qwer); ``` 所以执行以上代码的结果,同样是输出Hello,JS。 ### 数组对象 Array数组对象是JS对象中的一种,而这个对象中又内置了很多不同的方法。 ###### 例如我们创建一个数组 ```javascript var colors = ['yellow','green','blue','red'] ``` ###### 我们可以通过不同的方法来对这个数组作不同的处理 1. 增加一个字符串"purp" ```javascript colors.push('purp') ``` 2. 删除数组中的最后一个字符串,也就是purp ```javascript colors.pop('purp') ``` 3. 删除数组中的第一个字符串,也就是yellow ```javascript colors.shift ``` 相关的方法还有很多。 ### 间接回调 ```javascript function checkFlightSchedule(callback) { console.log('开始查航班信息'); // 模拟构建航班的时间信息 var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'hangzhou' }; callback(scheduleInfo.start); } //--------------------------------------- function callback(startTime) { console.log(startTime); } ``` 以上的代码,在最后要输出start,也就是飞机时间的时候。并没有直接使用`console.log`去输出内容,而是调用了一个名叫callback的函数。将这个函数作为代码传输的通道,把(scheduleInfo.start)给它,并通过这个函数,来输出里面的参数。 * 我觉得可以理解为其实就是在checkFlightSchedule,这个函数里面嵌套了callback这个函数,不知道这个理解是否有问题? ### 回调厨房工作流 ##### 体现回调 在执行`startwork`函数的时候,可以看到输出的内容。字符串:“事情准备好了,我先去洗个澡”是在“采购完毕”之前输出的,但是在`startwork`函数中,明明该字符串是在函数的最后一行,怎么会先执行呢? 这其实就是回调的体现,当回调函数B嵌套在一个函数A。执行函数A时,可以先把函数A先干完,回头再调用函数B。这代表我们执行A函数的时候,不会因为需要先执行B函数,而把整个函数A给“卡死”。回到老师的例子当中,`startwork`是A函数,`buyFoods`是B函数。 ##### 如何回调 ```javascript function a(callback) { alert("我是parent函数a!"); alert("调用回调函数"); callback(b); } function b(){ alert("我是回调函数b"); ``` 在函数中使用`callback`这个函数作为参数,并在内容中使用`callback`这就是“callback" 。 ================================================ FILE: homework/lesson5/WANG Xuanding.md ================================================ # 图片上的代码,第1行、第5行、第6行的name变量都有什么差异? ``` function output(a){ console.log(a); } var name='Hello,js'; output(name); ``` 为了区分name我直接将function中的name改成了a。第一行function中的name是一个形式参量,可以是任何形式的字符串。output(什么),console.log(什么) 第5.6行的name,第5行,name先是起到一个object的作用,赋予name‘hello,js’的字符串形式,第6行,output中的name,我把它理解程未知数,output这个函数是含一个未知数的多项式,()中的东西就是这个未知数,而这个未知数的赋值是在之前var的时候进行的,而多项式的定义是function。 因此,output(name)就成了求name='Hello,js'时,求值多项式(function值)的问题。 ================================================ FILE: homework/lesson5/WuGaoxing.md ================================================ 1. function output(name){ 2. console.log(name); 3. } 4. 5. var name = 'Hello,JS'; 6. output(name); # 代码理解 ### 代码整体理解: 1-3行是一个函数 函数名是output,参数是name 5行是定义一个name变量 类型是string 并赋值 'Hello,JS' 6行是调用函数output,并给函数传入了第5行定义的name ### 代码细分解释: 1-3 行的 两个 name 只是一个标识,标识调用此函数时传入的参数,在函数体内部哪个地方调用,或者怎么使用。可以理解成一个标识。两处 只要一样就行,这里完全可以改成 QQ 等类的 名字。 5行的 name 是定义了一个变量,并赋值,第六行是使用第5行的这个变量,这两处只要一样就行。 ================================================ FILE: homework/lesson5/Zhengchao.md ================================================ ### JavaScript Lesson5 学习心得 #### 知识点 - css是对html的美容,用来渲染界面 - 相比同时从服务器拿完数据再显示,分步骤拿数据的方法可以较好地减轻卡顿感 - 前端交互的关注点: ​ 用户与html的交互 ​ html与js代码的交互 ​ js代码与服务器的交互 - 复习函数的三要素:目标--函数名/要求--参数/结果--返回值 - 调用函数的顺序图很重要。每一个函数代表了一个功能模块,用一个调度函数将这些模块按照逻辑汇聚在一起,是我们实现大模块功能的基本思路。 - 一个函数的被调用时,完成了‘参数判断’,‘逻辑处理’,‘返回结果’这三个步骤。返回结果分以下三种做介绍: ​ 同步,直接返回(flight_schedule_1.js) `// 调用立即函数checkFlightSchedule` `console.log(checkFlightSchedule());` ​ 间接返回通道--回调(flight_schedule_2.js) 对于间接返回通道的理解,我想用以下代码来阐述: **相比直接返回,间接返回通道的存在,让代码变得更灵活,功能也更多样** ``function checkFlightSchedule(feedbackMethod) {` console.log('开始查询航班信息') var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'hangzhou' }; feedbackMethod(scheduleInfo.start); `}` `// 秘书这个函数库,不仅能提供查询信息的服务,还自带了多种返回信息方式的函数` `function weiXin(startTime) {` console.log('微信传来消息'+startTime); `}` `function duanXin(startTime) {` console.log('短信传来消息'+startTime); `}` `function email(startTime) {` console.log('邮件传来消息'+startTime); `}` `// 老板在调用秘书这个函数库时,需要携带信息定义好他想要的信息反馈等方式,其中可选微信,短信,邮件` ``checkFlightSchedule(duanXin);` ​ 异步,属于回调的一种方式(flight_schedule_3.js) `setTimeout(function() {feedbackMethod(scheduleInfo.start)},5000);` **在回调的基础上,异步给这个返回通道增加了延时** #### 作业 对下述代码的理解 - 对name的理解 `function output(name) {` ```markdown //第一个name是函数output的参数(parameter),它可以任意命名, //但必须具备可读性,比方说 name1 name2 console,log(name); //第二个name是函数output的argument(不知道对应的中文怎么说), //当它和第一个name同名,该函数才有意义 ``` `}` `var name = 'Hello, JS';` `// 第三个name是一个String变量name,并赋值为'Hello, JS'` `output(name);` `// 是函数output的argument,即调用函数output的参数,它的value等效第三个name` - 对kitchen_workflow_async.js异步函数的理解 **问题:省去函数命名的环节,到底是让函数更易读还是更不易呢?希望老师解答一下~** `function F2(feast) {` console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } `}` `function F1(foodsList) {` cooking(foodsList, F2); `}` `// 流程控制函数` `function startWork() {` var success = prepare(); if (!success) { console.log('还没准备好'); return; } buyFoods(F1); console.log('事情安排好了,我先去洗个澡'); `}` `// 干活啦~~` `startWork();` **总共定义了6个函数,**分别是采购函数buyFoods(),准备函数prepare(),做菜函数cooking()和流程控制函数startWork(),还有2个未命名的函数 **未命名的2个函数**分别是buyFoods()和cooking()的回调通道,前者用来传回foodsList数组,后者用来传回feast数组,并按照顺序打印 `function (feast) {` console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } `function (foodsList) {` cooking(foodsList, function (feast) { console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } }); ================================================ FILE: homework/lesson5/anjiancai.md ================================================ function output(name) { console.log(name); } var name = "Hello, JS"; output(name) 阐述程序执行过程: 运行上述代码时,读到1-3行的function,放在内存暂不执行; 往下运行至第5行,从右往左开始,把字符串“Hello, JS”赋值给新变量name,这是第5行中的name作为一个新变量出现; 运行至第6行,语句为output(name)函数,此句中的name为用第5行定义的新变量name; 然后再到内存中执行第1-3行定义的output()函数,第1行中的name为函数output的形式参数;而第6行调用函数中的name为实际参数,运行是将调用函数中的实际参数赋值给定义函数的形式参数,即第6行中的name赋值给第1行的name,最后运行函数体中的语句,直到函数体运行完毕,程序结束。 ================================================ FILE: homework/lesson5/baoguoqiang.md ================================================ # 懵懵懂懂的函数 ## * 感悟 听了几节课的下来,讲解的全是关于函数的调用和处理手法,有些云里雾里的,有些概念暂时还未理解。看到好多同学都交了作业,自己不想落下,中间也有过想放弃的念头,觉得自己理解能力有些跟不上,问问题又不知道怎么问,看到同学们在群里都很积极活跃,也看到了云飞同学的学习热情,看到了老师分享的他的作业,一步一步分析的很是到位,觉得再不跟紧队伍就真的跟不上了,也给了我一个大大的鼓舞,虽然自己的理解还相差甚远,也阻挡不了交作业的欲望(哈哈) ## *作业 >function output(name) { console.log(name); } >var name = 'Hello,JS'; >output(name); 关于上面几个"name"变量的差异: 1. function output(name)中的name是函数名下的一个参数变量; 2. console.log(name)中的name是函数内部中的一个局部变量;对于函数的内部调用有着至关重要的作用 3. var name 中的name是整个函数外部的全局变量; 4. 最后一个是调用函数所需的变量。 ## *小结 以上的理解是自己早上刚好看书到那一小结,讲解了这个全局变量和局部变量,就联系到这儿了。 关于函数的异步处理方案,老师讲解的现实中的例子能理解了,就是套用函数的方式,就蒙圈了,看的那些代码环环相套的感觉,似懂非懂的。下来要多练习,多看回放,紧跟大队伍,争取不掉队。 ================================================ FILE: homework/lesson5/caijinpeng.md ================================================ # 第五课作业 function output(name){ console.log(name); } var name = ‘hello,js’; output(name); 第一行的name是一个形式上的参数, 第五行的name是一个变量,这个变量的名字叫name, 第六行的name是实际的参数, 第二行的打印name,就是第一行传入第六行实际的参数name的值,值是第五行变量的hello js。 ================================================ FILE: homework/lesson5/caozhen.md ================================================ # 函数的定义与使用 ## 函数的定义 ```javascript function output(name) { console.log(name); } ``` 上面是一个程序开发者对函数**output**的定义: * 第一个name表示该函数有一个输入参数。 * 第二个name表示该函数的功能是打印出输入的参数。 ## 函数的使用 老师课上强调: > 函数定义了就要使用,否则就是垃圾函数 ```javascript var name = 'xiaoming'; output(name); ``` 上面的代码块正是在使用之前定义的函数**output**: * 第一个name是声明的变量,并将其定义为字符串‘xiaoming’ * 第二个name即函数在使用时,将上一行声明并定义的变量name传入。 ## 对课堂上高频问题的思考 老师在讲到此处时,有些同学表示不能理解这四行代码,主要应该是下面这个高频问题: ### 4个name,到底有什么区别?我们懵了。 #### 首先,也是最重要的一点,冷静下来,把4行代码拆成两部分,分别去理解: * 前两行是**定义**一个函数output * 后两行是**使用**这个函数output #### 其次,先看看前两行,定义一个函数(或者说声明一个函数) * 为什么需要函数定义?是为了告诉计算机(V8引擎)或者其它程序员: * 函数有几个参数? * 函数实现什么功能? * 函数返回什么结果? * 等等... * 函数定义是谁的工作?是程序员,设计函数的程序员的工作 * 因此,程序员定义函数时所用到的变量,他爱叫什么就叫什么 * 即name只是一个名词而已,可以把它替换成任意其它名词,比如: ```javascript function output(inputParameter) { console.log(inputParameter); } ``` #### 上面谈到,这个变量爱叫什么就叫什么,它不重要,那什么是重要的呢? * 定义函数时,以下几个内容很重要: * 有没有输入参数? * 如果有参数,有几个参数? * 如果有参数,这几个参数类型是什么? * 如果有参数,这几个参数在函数中有什么用? #### 上面这些真正重要的,需要我们关注的内容,是怎么反映出来的呢? * 以上几个内容,是通过定义函数时,参数的呈现形式反映出来的。比如以下几个例子: ```javascript // 没有输入参数 function output1() { console.log('这个函数没有输入参数'); } // 一个输入参数,以及它在函数中的用处 function output2(inputParameter1) { console.log('这个函数有一个输入参数,内容是:' + inputParameter1); } // 两个输入参数,以及它们在函数中的用处 function output3(input1,input2) { console.log('两个输入参数,我们把它们直接连接起来吧: ' + input1 + input2); } ``` * 因此我们总结,定义函数时,参数的名字不重要,但参数在函数定义中的存在形式很重要。 * 函数定义(声明)中使用的参数,行话称之为**形式参数**,简称形参。 #### 随后,我们来看后两行,函数的使用 * 函数定义了就要使用,定义了不使用就是垃圾函数,那么问题来了,怎么使用? * 函数的使用方式应该与定义一致,大白话就是:定义了几个参数(形式参数),使用时就应该是几个; * 因此,output这个函数应该这么用 * 使用时,传入一个参数 * 函数功能是把这个参数在屏幕上打印出来 * 以下展示了几种用法 ```javascript // 用法1 output('xiaoming'); // 用法2 var myName = 'xiaoming'; output(myName); ``` ================================================ FILE: homework/lesson5/chenguoqiang.md ================================================ # Lesson5作业Name的区别 函数的定义: > 说简单点就是“代码块”,具有可重复性。 函数的语法: > 函数就是包裹在花括号中的代码块,前面是了关键词:function。 > > 当调用函数时,会执行函数内的代码。 > > 提示:对大小敏感。关键词function必须小写,并且必须以与函数名称相同的大小写来调用函数。 调用带参数的函数: > 在调用函数时,您可以向其传递值,这些值被称为参数。 > > 这些参数可以在函数中使用。 > > 您可以发送任意多的参数,由逗号(,)分隔。myFunction(argument1,argument2) > > 当您声明函数时,请把参数作为变量来声明: ![IMG_8817](/Users/chenguoqiang/Downloads/IMG_8817.PNG) 通过上面的概念,我们清楚的知道了,图片第一行的“name”是参数,它也是一个变量,是output这个函数的参数,是用来表面函数逻辑关系的变量,不是实际的值,所以是可以更改的,即为形参。 第五行的name,是新定义的变量,跟上的函数变量没有任何关系,并给它赋值“hello,js’,更改赋值会影响最后的输出结果。 第六行的name,是相当于把第五行name的变量值传递给output函数,相对于第一行的name,这里的name是被赋值的参数,也被称为实参。第五行和第六行的“name”都是可以更改,但是必须保持一致。 ================================================ FILE: homework/lesson5/chenrushan.md ================================================ # lesson5 homework ## 几个`name`之间的差异 ```js function output(name){ console.log(name); } var name = ‘Hello,JS’; output(name); ``` - 第1行的name:是函数output的形参,函数被调用时,会新建一个局部变量name,便把实参的值赋给这个局部变量。 - 第2行的name:函数output接收到的参数值。 - 第5行的name:全局变量name。 - 第6行的name:传给函数output的实参。执行函数时,在当前作用域找到全局变量name,将它的值赋给函数里的局部变量name。 --- ## 异步实现kitchen_workflow ### 用`setTimeout(callback, timeout)`模拟延迟 把原本直接return一个值,改成,作为参数传入回调函数。 再用匿名函数`function(){}`把函数体包裹起来,成为setTimeout的callback参数。 ```js function buyFoods(callback){ setTimeout(function(){ // code for buyFoods; callback(foodList); }, 3000); } ``` ```js function cooking(foodList, callback){ setTimeout(function(){ // code for cooking; callback(feast); }, 5000); } ``` Question: 产生疑问,为什么prepare函数不用改成异步呢? 它最后返回的是布尔值,在主控制函数里进行判断,好像都不是其他函数需要的参数。 没想明白... ### 主控制函数startWork - 先调用`prepare()`, 条件判断产生分岔路: - 岔路(!success),没准备好,直接return(起初没写return,函数继续执行❌); - 岔路(success),依次执行buyFoods、cooking。(难点) 难点部分,老师是直接嵌套写: ```js // 徐帅版 buyFoods(function(foodsList) { cooking(foodsList, function(feast) { console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } }); }); ``` #### 下面是小白的曲折探索 小白看着有点蒙,小白是想这样写的: ```js // 小白第一版 function callback (feast){ console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } } let foodList = buyFoods (cooking); cooking (foodList, callback); ``` 结果当然是报错了:`foodList`是`undefined`,传给`cooking`的`callback(feast)` `is not a function`。 问题出在倒数的两行,再改: ```js // 小白第二版 buyFoods(cooking(foodList, callback)); ``` 结果当然还是报错了:`foodList is not defined`。`cooking(foodList, callback)`明显也不是个函数。 怎么把foodList作为参数传给cooking...想起上面setTimeout的第一个参数callback,整个匿名函数把cooking包起来,括号参数foodList。 ```js // 小白第三版 buyFoods(function(foodList){ cooking(foodList, callback) }); ``` 最后,把callback塞进去。ohhh,跟老师写的一样了。 #### 一点小改动 老师的`console.log('事情安排好了,我先去洗个澡');`是放在`buyFoods(function(foodList){…});`后面的。 执行的时候会出现,去洗澡这句,穿插在了采购食物之间。 ``` … 我要开始采购食物啦。。。。 事情安排好了,我先去洗个澡 采购完毕 … ``` 我想,是`buyFoods`里有异步代码,里面延迟时,就会先执行与`buyFoods`同一层级的同步代码。 我觉得应该是做完菜才去洗澡,所以想这样改,把洗澡改到`function(feast){}`函数体的最后,也就是打印完菜单就去洗澡。 ```js buyFoods(function(foodsList) { cooking(foodsList, function(feast) { console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } console.log('事情安排好了,我先去洗个澡');// 我想改到这里 }); }); // console.log('事情安排好了,我先去洗个澡'); 老师是写在这里 ``` ================================================ FILE: homework/lesson5/chenyanxing.md ================================================ 分析代码 下面代码中,第1行、第4行、第5行的name变量的差异: function output(name) { // 定义函数output,output接收一个函数类型的参数name,当执行完动作之后,调用该函数。 console.log(name); } var name = 'Hello,JS'; // 定义函数变量name,并且赋值'Hello,JS' output(name); // 调用函数output,并把函数name当参数传过去 观察代码 1.type_array 数组的样式:['中括号内容并排']; 遍历数据:挨个数组元素查一遍 for (循环开始的初始化变量 var i = 0; 循环条件 i < myLikeColorList.length; 计数器变量更新 i++) { console.log(myLikeColorsList[i]); } 2.type_boolean_sample.js var student = false; //虽然student是一个boolean类型的变量,但可以调用toString()方法,并输出string类型的值。 console.log(student.toString()); toString() 方法可把一个逻辑值转换为字符串,并返回结果。 返回值:根据原始布尔值或者 booleanObject 对象的值返回字符串 "true" 或 "false"。 3.type_number https://ws1.sinaimg.cn/large/006tNc79gy1fj3b745f8dj30n307gwfq.jpg 把Number对象转换成字符串,并返回此字符串。 从上图得到的结果可以看出,第一行打印出了 number 类型的变量值,第二行打印出了 number 变量转化成 string 类型后的变量值。 4.type_object 从例子看出,数据类型为对象的变量支持修改、增加和删除对象内变量,同时还支持函数变量。 https://ws2.sinaimg.cn/large/006tNc79gy1fj3brp9ufuj30ei0jdgod.jpg 再一次打印config时,内嵌的run函数变量只是显示 run: [Function] ,赋值的函数表达式不用打印出来❓ { height: 170, weight: 120, sex: 'woman', bloodType: 'A', run: [Function] } 5.type_string https://ws1.sinaimg.cn/large/006tNc79gy1fj3c1r54lej30c00kywgc.jpg 从上图可以看出,根据游标访问字符串的单个字符和通过字符串的长度属性循环访问单个字符,的打印结果虽然是一样的,但是用途却不同。前者更适合调用name的单个字符,而后者是循环访问单个字符。 通过游标切割字符串: console.log(name.substring(0, 4)); 定义与用法:substring() 方法用于提取字符串中介于两个指定下标之间的字符。 注意:语法 stringObject.substring(start,stop) 参数 描述 start 必需。一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置。 stop 可选。一个非负的整数,比要提取的子串的最后一个字符在 stringObject 中的位置多 1。如果省略该参数,那么返回的子串会一直到字符串的结尾。 说明:substring() 方法返回的子串包括 start 处的字符,但不包括 stop 处的字符。 如果参数 start 与 stop 相等,那么该方法返回的就是一个空串(即长度为 0 的字符串)。如果 start 比 stop 大,那么该方法在提取子串之前会先交换这两个参数。 提示:substring() 不接受负的参数。 indirect_call(最简单的间接返回) https://ws3.sinaimg.cn/large/006tKfTcgy1fj4f9d10z3j30el0a3wfw.jpg 从上图可以看出,前面function定义的函数都是存到内存去的,执行第14行run(callback);先调用函数run,再间接返回调用callback。 async_function(最简单模拟异步的技巧) 从上图可以看到,使用了setTimeout这个内置的方法,我们可以直接调用它,作用是模拟延时的一种实际场景,第一个参数:callback被调用的代码,第二个参数:时间,5秒。待5秒之后,调用函数callback的结果就打印出来了。 flight_schedule_1(立即返回案例) https://ws4.sinaimg.cn/large/006tKfTcgy1fj4gawufptj30n60j93zt.jpg https://ws2.sinaimg.cn/large/006tKfTcgy1fj4g0rjfqwj30b70eo0ug.jpg 老板不挂电话,秘书直接查起飞时间告诉老板。调用立即函数checkFlightSchedule,return一个结果。 flight_schedule_2(间接返回案例) https://ws1.sinaimg.cn/large/006tKfTcgy1fj4gpu7r9vj30mp0ipabk.jpg https://ws2.sinaimg.cn/large/006tKfTcgy1fj4hv63x66j30dq0hnju3.jpg 调用函数checkFlightSchedule,通过回调执行callback函数输出航班时间信息。 一开始对定义函数callback那里是有疑问的,为什么又设置了一个变量startTime❓通过老师举的例子,明白了这里函数定义的变量和上面传进去的变量是截然不同的,但值是一样的,scheduleInfo.start把值赋值给了startTime,就算startTime的函数名不同也是可以执行的。老师,这样理解对么? flight_schedule_3(异步处理案例) https://ws3.sinaimg.cn/large/006tKfTcgy1fj4zzcnp0vj30k80iw3zp.jpg https://ws1.sinaimg.cn/large/006tKfTcgy1fj502oazmrj30bi0gsjtj.jpg 从上图可以看出,与上个例子间接返回不用的是老板在调结果的时候,直接安插一个回调的通道,秘书处理完后直接通过通道告诉老板结果,这里使用了setTimeout来模拟这样一个异步情景。 kitchen_workflow_async(异步实现一桌酒席) 可以看到顺序图的强大,老师墙裂推荐把流程用时序图的方式画出来。不止是后面的课程会大量用到,甚至是以后的工作中都会经常用到,get新技能。 让我深刻的是,写函数的步骤其实就类似我们的生活,做事的流程一步一步转化成为代码,我想编程的意义大概就是把我们所想的东西,去学习去掌握怎么结合具体的语法,把它实现出来。 https://ws4.sinaimg.cn/large/006tKfTcgy1fj50hqar7ej30kd0ivwgj.jpg https://ws3.sinaimg.cn/large/006tNc79gy1fj5espqijoj30ih0zkjtf.jpg 一开始我的思绪是混乱的,觉得老师的顺序打印出来怪怪的,跟组员交流之后,发现是我想错了,没搞懂流程的顺序。理了下思路之后,有恍然大悟的感觉。 厨房做菜流程这里我们首先要学会把任务拆解,把流程分几步,把步分好,前面把函数prepare()、buyFoods()、cooking()给定义好,最后在startWork()函数,我们只需要调这个调那个,把事情搞定就是这样。 分析函数变量【表达式函数定义法】——在 startWork()里用了两层(参考lipeng同学作业) 第一层,买菜,调buyFoods()的时候 buyFoods(function(foodsList) { cooking(foodsList, function(feast) { console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } }); }); 这里function(){} 当成 buyFood 的回调函数变量: buyFood(function() {}); 给回调函数添加参数 foodList, 目的要把foodList传到下一流程: buyFood(function(foodList) {}); 最后,把买完菜之后要执行的代码,也就是做菜函数,cooking() , 放在{}花括号里:可以看到,cooking() , 有两个参数,也就是foodList和 回调函数变量。 第二层,做菜,cooking()的回调函数变量 把function(){} 当成 cooking() 的回调函数变量: cooking(foodList, function(){}); 给cooking的回调函数添加参数 feast, 目的要把feast传到下一流程: cooking(foodsList, function (feast) {}); 然后把做好菜之后要执行的代码,也就是console.log('----酒席准备好了----') 和做好的菜式,放在{}花括号里: cooking(foodsList, function (feast) { console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } }); 最后,把第二层构建的做菜代码,放在买菜回调函数花括号里{} 从这样: buyFood(function(foodList){ cooking(foodList, function(){}); }); 变成这样: buyFoods(function (foodsList) { cooking(foodsList, function (feast) { console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } }); }); 总结 回调的基本格式: function caller(callback) { // do something var data = XXX; // pass data to callee callback(data); } function callee(data) { // do following thing } caller(callee); ================================================ FILE: homework/lesson5/chenziwen.md ================================================ # 【第五节课作业】分析代码 作题日期:2017年9月10日 ## 【作业题目】 1. 阅读study/lesson5的sample代码,并执行观察结果。 2. 图片上的代码,第1行、第5行、第6行的name变量都有什么差异?请分析差异提交你的结论。以你命名的md文件提交。 ![](https://o3b126ie1.qnssl.com/avatar/081d10a4-6e49-47a5-8f9b-ca7d48dacb78) --------- ## 【变量差异分析】 1. 第5行的变量name是声明并定义赋值为'Hello,JS'; 1. 第6行的变量name是函数output()调用时把函数外部的变量name传递给函数内部; 1. 第1行的变量name是函数接收传递到函数所用的变量; 1. 第5行与第6行的变量是同一个变量,是函数外部定义的变量; 1. 第1行的变量是函数内部的变量; 1. 第1、5、6行的name变量的值是相等的。 **项目目录:study/lesson5 中带有"sample"单词的JS文件共有5个,分别是:** + ### [`type_array_sample.js`](https://github.com/xugy0926/getting-started-with-javascript/blob/master/study/lesson5/type_array_sample.js) //数组类型变量示例 + 代码理解: + 首行给出Array数组对象的参考链接; + 声明定义数组变量`myLikeColorsList`并赋值; + 输出打印`myLikeColorsList`,结果:`[ 'blue', 'green', 'black', 'write' ]`; + 举例"遍历"数据,使用for语句,第循环一次打印一个当前数组元素;我理解这部分是展示获取值的方法; + 最后分部展示操作数组对象的4个方法: + .push('red');增加一个元素`'red'`到数组末尾;结果:`[ 'blue', 'green', 'black', 'write', 'red' ]` + .pop();删除数组末尾的元素;结果:`[ 'blue', 'green', 'black', 'write' ]` + .shift();删除数组最前面的元素;结果:`[ 'green', 'black', 'write' ]` + .indexOf('black');找到某个元素在数组中的索引(游标);结果:`1`;//用于定位指定元素方便操作 + ### [`type_boolean_sample.js`](https://github.com/xugy0926/getting-started-with-javascript/blob/master/study/lesson5/type_boolean_sample.js)//布尔值类型变量示例 + 定义一个布尔值变量`student`并输出打印,输出过程调用toString()方法. + >toString() 方法可把一个逻辑值转换为字符串,并返回(字符串)结果。 + 测试:删除toString() 方法后输出报错,看来console.log()只能输出字符串,调用console.log()方法必须确保参数类型是字符串类型 + ### [`type_number_sample.js`](https://github.com/xugy0926/getting-started-with-javascript/blob/master/study/lesson5/type_number_sample.js)//数字类型变量示例 + 理解同上; + ### [`type_object_sample.js`](https://github.com/xugy0926/getting-started-with-javascript/blob/master/study/lesson5/type_object_sample.js)//对象类型变量示例 + 定义对象变量(变量集合)config; + `console.log(config);`输出对象值,所有非文本变量在输出前被自动转换成文本 + `config.sex = 'woman';`对对象属性赋值,改变值内容 + `config.bloodType = 'A';`增加对象的属性`bloodType`; + `delete config.age;`删除对象属性'age'; + <<<<<<<<<< + 我是分界线 + <<<<<<<<<< + 老师定义了1个变量run()并赋值为函数变量;输出了2行字符串; + 新定义了一个`config2`对象,并在对象内部定义了一个函数run()使其成为`config2`的方法,最后调用`config2`的方法; + ### [`type_string_sample.js`](https://github.com/xugy0926/getting-started-with-javascript/blob/master/study/lesson5/type_string_sample.js)//字符串类型变量示例 + 首先,定义并赋值一个字符串变量`'xiaoming'; + 对字符串进行操作: + 输出字符串 + 根据游标访问字符串的单个字符并输出,每行输出一个字符; + 字符串有长度属性,通过循环遍历单个字符并输出,也是每行输出一个字符; + 通过游标切割字符串:`console.log(name.substring(0, 4));`根据结果"xiao"来猜测,参数`0`设定从第几个游标开始往后计算返回第`4`个字符开始到末尾的值; + 查询老师给的参考文档,其描述是:**substring() 方法用于提取字符串中介于两个指定下标之间的字符** 以上是题目的回答 -------------- + 作完题后我去看看其他同学的作业,caozhen同学的作业乍一看太口语化,我没一下看明白.但他是用了自己提问自己回答的方式思路来思考老师给出的问题,由点带线串起来,对自己的理解进行了一次梳理,这是我觉得要学习的地方. + 再看大师兄何伟的作业,厉害呀!他的作业是在研究回调和异步处理了!我要先交作业,回头再来细看!佩服! + 再看老师给的"小白典型"王云飞同学(其实我也是小白...)的作业,还是佩服!王云飞同学首先对老师讲的内容进行了回忆总结.再对自己的疑问列举分析,百度查找.再对老师给的代码按自己的思考修改和测试验证自己的想法,动手意愿很强,而我只是运行了老师给的代码而已,何伟也对自己的想法进行了验证,得到了新的理解.我要向他们两位学习这一点. + 摘录王云飞同学作业里的一句名人名言: + >**每一个人都必须按照他自己的方式去思考;因为他在自己的道路上,就会发现能帮助他度过一生的一条或者一种真理。但是他切不可放任自己;他必须克制自己,光有赤裸裸的本能是不行的。 ——歌德** ================================================ FILE: homework/lesson5/cloudyview.md ================================================ # 第五课作业 ## 1. 阅读study/lesson5的sample代码,并执行观察结果。 * ### type_array_sample.js 这个程序主要展示了数组类型数据的操作方式。 首先,如果console.log直接打印一个数组的话,会将“=”右侧的数据完整展示出来。 通过for循环,利用游标可以实现数组数据的遍历。这种方式可以直接抽取数组里面每一个元素来打印。 下面的几段语句实现了对数组的操作。push方法,在数组末尾加入新的元素;pop和shift分别可以将数组最前面和最后面的元素删除;利用indexof()可以查询到某一个元素的游标是多少。 * ### type_boolean_sample.js/type_number_sample.js 布尔类型只有true和false两个值。这两个值可以利用toString()方法,可以转化为字符串类型。利用typeof()方法可以看出,转化后的是字符串类型。数字类型的数据也可以用这个方法来转化为字符串。 ## 2. 图片上的代码,第1行、第5行、第6行的name变量都有什么差异?请分析差异提交你的结论。以你命名的md文件提交。 ================================================ FILE: homework/lesson5/cuimiao.md ================================================ #小白cuimiao的第五节课作业(在此期间学习了第九课) #一.老师的问题是:代码中第1,5,6行的name的差异分别是什么? 第一行的name,是指定义output这个函数时,他的参数是name; 第二行的name,是指运行output这个函数时,打印这个参数name; 第五行的name,是指定义一个变量name,并对这个name赋值为'Hello,JS',其实恰好这个变量只是拼写成name而已,当然可以改为别的,这样似乎更好理解; 第六航的name,是指运行output这个函数,其参数是name,这个name是刚才第五行定义的变量name; 运行output(name)这个函数的结果,返回值就是'Hello,JS' #二.这节课的笔记 详见我的云笔记 #三.这节课复习后的收获(特别要感谢我们小组的李朋队长) 1. 问题1:“显示” 这个动作,用代码表现的话, 就是 console.log(),而return虽然有返回值,但如果没有console.log(),就不会显示return的返回值。 2. 问题2(具体结合我的云笔记的截图):startTime赋值是checkFlightSchedule这个函数,这个函数运行的结果返回值是scheduleinfo.start,所以return的结果就是赋值给了startTime,所以7之后是时间 3. 李朋给我的解释(具体结合我的云笔记的截图): ()=>{} 就是函数的简写 4. 第五课作业老师要求我们复习代码,第一段代码是立即返回的案例,我试着用老师第九节课的方法,把console.log(1);等都按顺序打好,自己心算一遍顺序,运行代码,和自己心算结果意义,很开心!!! 5. 第二段代码,是间接返回的案例,我心算打印顺序错了,但后来自己理解了。高兴!这段代码要结合我第五课的笔记第19条来看,就能理解callback这个函数定义以及运行callback如何打印出scheduleinfo.start 的值出来。 6. 第三段代码,study lesson 5 中的flight_schedule_3.js 这个代码,是异步处理的案例。我试着用打印顺序,虽然没再犯上一段代码的错误,但还是有个问题,遗忘了5秒延时的事儿(详见我的云笔记及截图)。 ================================================ FILE: homework/lesson5/dengxy0907.md ================================================ 第五课 ========= > 第一行的name是参数,可以是name,也可以是任意值 >第五行的name是一个变量,也可以是其它名字。 > 第六行的name是一个变量,等于第五行的name,调用了output函数; 题外话 ---------------- ### 首先祝老师教师节快乐 ### 关于编程课的一心里话 > 本来想把作业补完再一起pr的,但是现在看来这点时间不足以做完了,只能先把之前的做的很草率的作业先交了,虽然几次作业在做完后参考了其它同学的作业后有新的见解,但是我还是决定发我最早写的。 >我自己的话对于编程的基础就是大学一个学期的php课,因为我不是计算机专业的,所以几乎注定了学校编程课的水分,但是我可以摸着良心说我尽力了。 >在基础上,我比纯小白走的好一点,甚至8月24日的课我还是在动车上用流量看的,在8月24日之前,虽然因为自己的事情拉下了,但是我其实是不太急的,虽然作业很草率,但是流程我打通了,而且我还看的懂大部分的代码,那个时候函数这一块虽然还有点懵懵懂懂,但是除了小细节外,一些概念在我脑子里是打通了的,在老师的课中,几乎所有我之前写过的不知其然的东西(包括但不限于post和get)似乎都清楚了,甚至现在看游戏中的生死都会想到布尔值。 > 想想挺后悔没有进幼儿园的,最先是觉得我能跟的上,现在群里说的什么几乎都看不懂,因为一直在补课,遇到的比较多的问题还是在代码上,应该算是不好意思问吧,我觉得代码这个总能查的到,还有就是确实目前还没遇到太大的bug,总想着自己先排查一下,还有一个原因就是笑来说的每个人最重要的就是注意力,我自己也能翻墙,条件已经比很多人好太多了,虽然在高考前我有过因为我补课抛出很多问题在一定程度上补充了优秀学生盲点而让他们很愿意帮助我解决问题的经历,但是我还是不愿意在我还有机会自己解决的时候去问,我还是希望我能查得到就先查吧,我还看的懂,我先调试调试再说。 > 这次课程拉下的原因主要还是两点,1、时间没有安排好;2、不愿意去问;前者占90%以上,不想去抱怨太多了,虽然在9月3日后发生了手机摔坏主板等意外让我沉不下心学习,但是确实我在敲代码和解决bug上用的我认为还不够多。 ### 补课纪录 >本来想写一篇文档纪录自己补课的过程的,但是后面放弃了,我这里简单回忆一下我自己的这近一个月的经历吧,因为自己没有能力拒绝一些事情导致实际学习的时间不多,因此在作业上主要还是为了打通流程,虽然敲代码这件事依旧是我最爽的事情,但是在学习上我现在认为先打通流程是必要的。 > 1、最开始是软件安装,因为很久之前尝试了新生全栈营的代码,遇到的bug,后来重装系统解决,还有我忘记了的小问题,因为其他同学遇到在新大内提问的到解决,我也顺带着解决了. > 2、记得第一个md作业,插件是在聊天群里的看到下载的,但是不知道怎么调用,自己是先写了文档,实在老师下一次课说了快捷键后我才知道怎么调用 > 3、在git上就是 .DS 文件的问题,在放弃 -A和用了 -m 后解决,至于html的话确实是为了先打通流程偷懒简单写的。 > 4、在异步上还是需要多写点代码,对看异步代码这件事情还是需要大脑运算一下,时间没有剩下几天了,所以在第六课作业时想的还是打通流程,参考的还是同步,自己话有点多,在打这篇文章上也花了不少时间,现在觉得还是觉得理解并学会异步这件事情比打通流程更重要,但是课程快结束了,我还落下挺多的。 > 5、在写第7课的作业时脑子挺乱的,先是习惯性的想打通流程,代码看的有点乱,因为是在补课,我是第六节课作业写完后才看的第7节课,后来在参考老师代码时被自己第六节课的代码和vue、第三方库弄乱了,在最乱的时候脑子里突然飘过老师说的 在哪里,要往哪里去,所以就重新写代码,然后遇到bug的时候才想起有第三方库这件事情,就又看了回放,刚好看群里有解决方案,然后在npm install后老师的代码可以运行了,自己的也可以了,不知道为什么,jsonFile.readFile就可以,加入jsonfile.wtiteSync就出现了找不到jsonfile模块的bug。而且在尝试代码的时候也遇到了一个不理解的代码执行顺序临时加过来问一下老师吧,因为想先打通流程就没有先google,在遇到后面的bug后自己在烦躁后重启了电脑,打算第7次作业留着从头再来。 ![为什么for循环在console.log后执行](https://ws1.sinaimg.cn/large/006tKfTcgy1fjev8q45wbj30sc0w0jxe.jpg) > 除了实践不够多之外,确实想不到那么多词汇去具体描述,也想不到有可以通过那么多方面去理解要理解的事情,自己的这份作业更像是一个婴儿在咿咿呀呀的学语,这个是在什么什么,那个是什么什么。这份文档确实说了很多我觉得不应该说的话,但是我还是想纪录下来。 > 最后再次感谢老师为我们这群小白做了这么多。 ### 关于这个意外 >可能是由于在尝试代码的时候无意中修改了不该修改的代码,导致同步一个fork时git进入编辑器问我为什么要fork,这个pr是昨天的,但是今天在老师的代码文件里我的作业是没有的,code那一栏的pr里却有我的pr,我意识到出问题了。 > 如果这次pr成功,那就说明我的解决方案是正确的,我删除了我原先fork的项目重新fork了一份,在电脑上重新clone并修改我的作业。 ### 突然想加的臭不要脸的话 > 在找代码的时候有点懵,可能犀牛书该看的部分还没看完是一个重要原因,做作业主要还是参考代码+goole,犀牛书总是被忽略,我想如果犀牛书也加入预习作业可能是一个不错的选择。 > 今天是开学的第一天,这学期有节关于运营的课程,虽然这个课程几乎全是界面操作的,但是在听老师讲解课程的时候就觉得这个课程的技术层次就是js课里用到的啊,而且学校课程是在局域网里的,如果js我早一天做完我甚至可以直接把网页布置到自己的服务器上的。 > 我不是一个好的学习者,作为学生我还有很多缺陷,现在的慌张就是为之前自己挖的坑买单,就不多说了,先pr试试看吧。 ================================================ FILE: homework/lesson5/diaozhicong.md ================================================ #第五次课作业 【作业内容】 1. 阅读study/lesson5的sample代码,并执行观察结果。 2. 图片上的代码,第1行、第5行、第6行的name变量都有什么差异?请分析差异提交你的结论。以你命名的md文件提交。 ## ###1.运行结果 + async_function.js //启动运行5秒后显示: **我终于被调用了** + indirect_call.js //启动运行后显示:**�������������������������� ** **我跑完了** + flight_schedule_1.js //启动运行后显示: **开始查航班信息** **8/23 8:00** + flight_schedule_2.js //启动运行后显示: **开始查航班信息** **8/23 8:00** + flight_schedule_3.js //启动运行后显示: **开始查航班信息** //5秒钟后显示: **通过反馈通道获得了信息** **8/23 8:00** ###2.分析变量Name的差异 第1行的变量name是函数output的参数; 第5行是定义一个变量name并赋值‘Hello,JS’,这个name与第一行的name本质上没有关系; 第6行的变量name是函数output调用的一个参数,此时调用name就将第5行的name和第1行的name联系起来了。是回调的一个概念。 ================================================ FILE: homework/lesson5/donglili.md ================================================ ## 代码分析 1. function output(name) { 2. console.log(name); 3. } 4. var name = 'Hello,JS'; 5. output(name);` 上面的代码,其中: 第1行的 name 是 output()这个 function 的参数定义值。是用来接收后面(第5行)的调用函数的值的。这个数可以是任意能使用的,只要他和第2行输出的那个console.log()中的一致就可以。比如,可以使用a,b,c等等。 第4行的 name 是 一个独立的变量,就是个变量名,我们定义这个变量为"Hello,JS"。 第5行的 name 是 把第4行的变量 name 作为 output()这个函数的参数,送到第1行定义的函数内,运行函数。第4行及第5行的name也可以用其他代替,只要一致就可以。 ================================================ FILE: homework/lesson5/fangqingyang.md ================================================ ### Lesson5 #### 第一行name 可以是任意一段字符串,指明叫name是因为作者想用这个名字来说明:这段字符串是用来做name的,只是名字与第5行第六行相同,其实他们之间没什么关系。 #### 第五行name 变量的标识名称,指向‘Hello, JS'这个字符串,是’Hello, JS'这个字符串的进一步抽象,方便调用,就像我们每个人有一个名字,那个名字的代表我们这个人。 #### 第六行name 就是指'Hello, JS'这段字符串,将'Hello, JS'这个字符串作为参数(要求)传给output这个函数。 #### 回调 平时都是字符串,数组,数值作为函数参数的,现在函数也作为参数。 异步是回调的一种 类似,老妈早上和儿子说晚上你来煮饭(调用函数),我去上班,儿子到了晚上开始做饭(根据参数晚上),老妈还在上班(同一时间,老妈在上班,儿子在煮饭,异步),老妈回家,儿子煮好饭。(得出结果) 老师说的一个情景,网页,先显示一个LOADING,在用户看着LOADING的同时,浏览器在和服务器做数据交互,各自做各自的,而不是让用户看着空白的页面,以为什么也没发生,等不下去,关了。 ================================================ FILE: homework/lesson5/fanliao.md ================================================ # 【作业内容】 ## 图片上的代码,第1行、第5行、第6行的name变量都有什么差异?请分析差异提交你的结论。以你命名的md文件提交。 ## 谈谈我对这几个‘name’的理解,还请老师看看我对课程的理解是否正确。 1. 第一行和第二行中的两个‘name’必须书写的完全一致,它是函数output的参数; 2. 第五行和第六行中的两个‘name’ 必须命名的完全一致,它是一个新的变量,而且在第五行这个变量已经赋值了‘hello,js’,然后调用函数Output,将这个值通过第六行的‘name’传给函数中的第二行,打印出来; 3. 所以说其实将第一、二行的'name'同时换成'a',把第五、六行的'name'换成'b'应该对于这段代码的运行毫无影响的,之所以要全用'name'命名,只是考虑到在做大的项目中,这样的命名增强了代码的可读性,所以我们作为初学者也要学习这样的好习惯。 ================================================ FILE: homework/lesson5/fanqing.md ================================================ ## 作业-1 要求:阅读study/lesson5的sample代码,并执行观察结果。 ### 完成情况 逐个sample代码对打执行,对数组中 push/pop/shift/.indexof的用法印象最深,kitchen_workflow_async 耗时最长。 #### 在kitchen_workflow_async代码中: (1)增加读取随机数结果语句; (2)增加运行观察节点console.log(1)-console.log(12),了解:函数中只有return后的内容不再执行,其他还会在调用其它函数后返回继续执行。 #### /----- 代码部分 -----/ function buyFoods(callback) { console.log('采购原料和菜'); setTimeout(function() { console.log('采购完毕'); var foodsList = ['fish','egg','meat']; console.log(1); callback(foodsList); console.log(2); }, 5000); console.log(3); } function prepare() { console.log('努力磨刀...努力洗碗...努力打扫...劳动最光荣'); //return (Math.random() > 0.5); 原句式,以下为自己修改。 i = Math.random(); console.log(i); return (i > 0.5); console.log(4); } function cooking(foodsList, callback) { console.log('开始做菜啦~~~'); setTimeout(function() { console.log('今天要做这些菜' + foodsList); console.log('大功告成,上菜'); var feast = ['鸡蛋西红柿','红烧肉','红烧鱼']; console.log(5); callback(feast); console.log(6); },5000); console.log(7); } function startWork() { var success = prepare(); console.log(8); if (!success) { console.log('还没准备好'); return; } console.log(9); buyFoods(function(foodsList) { console.log(10); cooking(foodsList,function(feast) { console.log('----- 酒席准备好了 -----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } console.log(11); }); console.log(12); }); console.log('事情安排好了,我先去洗个澡'); } startWork(); #### /----- 执行结果1 -----/ an-macprodeMacBook-Pro:Documents kan_macpro$ node JS-L5-kitchen.js 努力磨刀...努力洗碗...努力打扫...劳动最光荣 0.3553369629799288 8 还没准备好 #### /----- 执行结果2 -----/ an-macprodeMacBook-Pro:Documents kan_macpro$ node JS-L5-kitchen.js 努力磨刀...努力洗碗...努力打扫...劳动最光荣 0.7182601417865426 8 9 采购原料和菜 3 事情安排好了,我先去洗个澡 采购完毕 1 10 开始做菜啦~~~ 7 12 2 今天要做这些菜fish,egg,meat 大功告成,上菜 5 ----- 酒席准备好了 ----- 鸡蛋西红柿 红烧肉 红烧鱼 11 6 ## 作业-2 要求:图片上的代码,第1行、第5行、第6行的name变量都有什么差异?请分析差异提交你的结论。以你命名的md文件提交。 ![](https://ws3.sinaimg.cn/large/006tKfTcly1fj58adl6wbj30ls09qgmz.jpg) ### 我的回答 第1行的name是声明函数方法output的参数名称,因在函数内部直接使用到,不能省略。可以是任意名称,内部用名应与其保持一致。 第5行的name是声明的一个新的变量,并定义赋值,第6行的name是对新声明的变量执行output函数方法,第5行的name可以是其他任意变量名,第6行name与其保持一致,运行结果完全相同。 ================================================ FILE: homework/lesson5/fengkai.md ================================================ function output(name){ console.log(name); } var name = 'Hello, JS'; output(name); 1.第一行的name是 output函数的参数,并且这个参数是个变量; 2.第五行的name是 声明一个变量叫name,并赋予了这个变量一个值; 3.第六行的name是 调用了output函数以及他的变量参数。 ================================================ FILE: homework/lesson5/guowei.md ================================================ # 小白JS入门不放弃 lesson5 *Focus Question:回调* ## 又爱又恨的“回调”一桌酒席 ### 代码难点 * 函数变量 > 函数变量:在JavaScript中,调用者可以把函数赋值给变量,也可以将其作为参数传递给其他函数。 举例: 在```setTimeout()```中,```function() {};```便是函数变量,作为参数传递给```setTimeout()```函数。 又如: 在```startWork()```中,```function (foodsList) {};```和```function (feast) {};```都是```startWork()```的变量。 * 匿名函数 >顾名思义,**匿名函数**就是没有名字的函数,它的作用是为了让代码简单化。 举例:在```setTimeout()```中,```(function() {};```便是一个匿名函数。function之前的左圆括号是必需的,因为如果不写这个左圆括号,JavaScript解释器会试图将关键字function解析为函数声明语句。使用圆括号JavaScript解释器才会正确地将其解析为函数定义表达式。 又如:在```startWork()```中,出现两次```(function (foodsList) {};```和```(function (feast) {};```都是匿名函数。 * 回调函数 callback Google给出的解释: >A callback is a function that is passed as an argument to another function and is executed after its parent function has completed. 在“一桌酒席”里,我被回调搞得一脸懵逼,反复查犀牛书和google,仍然不是特别明白。 参考何伟同学总结的回调格式: >``` >function a(callback) { > // do something > var data = XXX; > // pass data to b > callback(data); >} > >funtion b(data) { > // do following thing >} > >a(); >b(); >``` 我目前理解的是:先执行函数a,而且不会等到a完全执行完才执行函数b, 在a的过程中就执行了函数b,b完成后返回执行callback这个函数。 ### 问答题:区分同名的变量 老师给出的例子: >``` >function output(name) { > console.log(name); >} > >var name = 'Hello, js'; >output(name); >``` 其中第一个```name```、第三个```name```和第四个```name```都是变量:第一个```name```是```output()```这个函数声明语句的参数变量;第三个```name```是字符串变量,并被调用者赋值```'Hello, js'```,第四个```name```是```output()```函数的参数变量。 第二个```name```则是输出的字符串。 ================================================ FILE: homework/lesson5/hanwei.md ================================================ ## 第五节课作业 第1行的name表示函数用来接收参数的变量,这个变量和第二行的name是一个。相当于声明一个变量,但和一般的声明变量有不同,只有在调用函数的时候才会定义和赋值,用来接收传递过来的参数。而且它的作用范围只在一次调用的函数中,函数执行完成随即失效。 第5行的name则是在这段代码中声明定义并且赋值,在这段代码中它是一个明确的正在使用的变量;不同于第一行的变量只有在调用函数的时候才实际生命定义并使用。 第6行的name,实际上就是第5行的name。它的作用就是调用output函数,并将变量name传递给它。这个过程中,output会在内部生成另一个name来接受它。虽然两者的名字一样,但由于作用的范围并不相同,所以并不冲突。 ================================================ FILE: homework/lesson5/haohu.md ================================================ - 第1行的name是函数定义的一部分,是函数的形参; - 第5行name是自定义的变量名,用来在程序其他地方使用; - 第6行的name和第5行的name是一样的,是对变量使用. ================================================ FILE: homework/lesson5/hewei.md ================================================ # 第五课作业 ## 回调和异步 ### flight_schedule_2.js 这个例子简单地介绍了一下回调,以我目前的理解,就是在一个函数内再调用另一个函数。 为什么要这么做呢?因为两个函数之间有交互,我要把一个函数里面处理后产生的结果,传递给另一个函数处理。虽然用最原始的 `return` 这种方法将返回值传递给另一个函数进行处理也是可以的,但是采用回调的方式,能够简化代码,省去了 `return` 的步骤。 但是,因为这个例子只有前端部分的内容,所以只看这个例子的话,对于回调并没有深入的理解。 ### flight_schedule_3.js 这个例子,在前一个例子的基础上,加上了人工制造的延迟,是为了模拟前端向后端获取数据、等待数据返回并接收数据的过程。 但是除此之外,和前一个例子没什么区别,所以还是对这个代码理解得不是很好。 为了便于自己理解,将 `checkFlightSchedule()` 函数修改为如下形式: ``` console.log('开始查航班信息'); setTimeout(function() { // do something callback(scheduleInfo.start); }, 5000); console.log('先去喝口水'); // 自己补充的一行代码 ``` 这样一来,终端的输出结果就是下面这样子的: ``` 开始查航班信息 先去喝口水 通过反馈通道获得了信息 8/23 8:00 ``` 可以看到,秘书在等待航班信息返回的过程中去喝了口水,回来之后看到了信息。在等待信息返回的过程中,还可以做别的事情,不用干等着。而在默认的情况下,开始查信息之后,如果没有获取到返回的结果,是没法做别的事情的。 补充了上面那一行代码之后,感觉对回调的理解更深刻一点了。 ### kitchen_workflow_async.js 这个例子,把之前准备酒席的代码,改成了异步的形式。 因为是初次接触 **回调** 这个概念,所以异步版本的酒席代码,看着还有点儿乱糟糟的。自己手动整理了一下,把代码改成了下面的形式,便于自己分析理解: ``` function buyFoods(callback) { console.log('start buying...'); setTimeout(function() { // do shopping var foodsList = XXX; callback(foodsList); }, timeOfShopping); } function prepare() { // preparation } function cooking(foodsList, callback) { console.log('start cooking'); setTimeout(function() { // cooking var feast = XXX; callback(feast); }, timeOfCooking); } function startWork() { if (!prepare()) { console.log('Not ready yet'); return; } buyFoods(function(foodsList) { // when foods were bought to kitchen // passing foodsList to anonymous function/callback function // to do the following cooking things cooking(foodsList, function(feast) { // cook the foods from buyFoods() // and deliever the feast to guests console.log('Let\'s eat!!!'); }); }); console.log('All done, have a rest'); } // above are all workflow // the REAL WORK is done here! startWork(); ``` 通过自己重新手写这段代码,真的是有了更深的理解!就在二十多分钟前,还对这段代码懵懵懂懂。经过这二十多分钟的重写+分析,理清了整个异步执行的流程,这种攻克难关的感觉太美妙了!!!哈哈。 这二十多分钟,给我带来的宝贵经验就是:不要只是看代码,要去写!一边写一边分析,一遍不行两遍,两遍不行三遍,最后肯定能看懂、看熟、看透代码。成长,就是在这个过程中产生的。 ### 自己加餐 读完了老师的代码,感觉还不过瘾,那就自己再写一个吧。 ``` ... ... ... ``` 上面的代码只列出了关键的部分。通过设置 `ajax` 函数中的 `async` 参数,可以分别展示 `同步` 和 `异步` 执行的结果。各自的执行结果如下: ``` // async: false 同步执行 Example started. 888996 Example ended. // async: true 异步执行 Example started. Example ended. 888996 ``` 从上面的执行结果可以看出来:同步执行的时候,必须等待 `ajax` 请求获取到了所返回的结果并进行处理之后,才会执行后面的代码。 而异步执行就不是这样了,发起 `ajax` 请求之后,一边等待结果返回,一边继续做其他的事情。 ### 新发现 ``` getData(writeData); console.log('Something else happen'); function getData(callback) { var timer = setTimeout(function() { var dataArray = [123, 456, 789]; callback(dataArray); }, 3000); } function writeData(myData) { console.log(myData); } ``` 上面的代码,会先输出什么呢?是那一句英文。为什么会这样?因为在执行第一行的 `getData` 之后,这个函数在 3 秒钟之后才会给出结果。而代码同时执行到了之后的输出语句,就先把那句英文输出了,然后在 `getData` 的执行时间到达 3 秒钟之后,再输出数组。 前面自己对代码理解的不够透彻,还以为会先输出数组,再输出英文。而经过对这一段代码的剖析,让自己对回调函数的理解又有了进一步的深入。 ### 总结 最后,再总结一下回调的基本格式: ``` function caller(callback) { // do something var data = XXX; // pass data to callee callback(data); } funtion callee(data) { // do following thing } caller(callee); ``` ## 区分同名的变量 ![](https://o3b126ie1.qnssl.com/avatar/081d10a4-6e49-47a5-8f9b-ca7d48dacb78) 在上图中,第一行代码里的 `name`,表示不管用户传入的是什么参数,都会通过 `output` 这个函数将其打印出来。 而第五行和第六行的 `name`,则是用户所要打印的内容的一个"昵称"。我们用这个昵称来指代用户所要输出的内容,没有这个昵称当然也完全没关系,但是加上这个昵称,能够使函数更容易阅读。比如用户如果要输出一大段文字,把这段文字直接作为参数传给 `output` 函数的话,不管是阅读代码,还是修改代码,都会很不方便。而用昵称来指代这一段文字之后,代码就会清晰很多。 将代码重写一下,下面的形式,应该就更容易理解了: ``` function output(anythingYouWantToOutput) { console.log(anythingYouWantToOutput); } var content = "三国演义全文"; output(content); ``` 猜测老师之所以要把代码写成图里的那种形式,就是为了让大家对代码的 `形参` 和 `实参` 有一个更好的理解,因为这个问题迟早要遇到,不如让大家一开始就去思考、去研究。 参考资料: - [Understanding JavaScript Callbacks](https://closebrace.com/tutorials/2017-01-17/understanding-javascript-callbacks):通过实例演示,来让读者对回调函数有一个逐步深入的认识。 - [How to format a float in javascript?](https://stackoverflow.com/questions/661562/how-to-format-a-float-in-javascript):介绍了如何设置小数点的精度。 - [What does setTimeout return?](https://stackoverflow.com/questions/10068981/what-does-settimeout-return):解释了 `setTimeout()` 函数所返回的整数的含义。 ================================================ FILE: homework/lesson5/huangBiLing.md ================================================ ## 我的第5课作业 ### 第5次作业要求: #### 题目: 图片上的代码,第1行、第5行、第6行的name变量都有什么差异?请分析差异提交你的结论。以你命名的md文件提交。 ![](https://ws3.sinaimg.cn/large/006tKfTcly1fmqq5c22x5j30ls09qabe.jpg) #### 答: 第1行name:是函数的形参变量;作用是在函数结构()的这个地方,作为实参/值/数据的提示,就是让读代码的人了解到这个函数想要调用的实参/值/数据是哪方面的,比如,是“名字”还是“动作”,等等。 第5行name:此处name是刚定义的实参,引用一个字符串类型的值'Hello,JS'。 第6行name:调用函数output,并导入/调用实参name = 'Hello,JS'。 ================================================ FILE: homework/lesson5/huangjiashu.md ================================================ ### 写在前面 做作业之前我在思考一个问题,那就是 间接返回 。 看直播时对 间接返回和异步 一直搞不清楚。自我感觉模棱两可。故在做作业时有了以下思考。 作业本是七夕下午写的,无奈七夕老板大发慈悲整整提前一个小时允许大家下班,然后被同事拉去吃东西。因为我电脑一直在维修中,所以作业其实是第二天写完了。 七夕当天提了个问题在issue,感谢老师和其他同学的回答。最为感动的是深夜看第六节的回放,看的很感动。因为某些人在我的作业中竟然体会到了我的感受。也感谢老师和同学们的鼓励。我上周非常忙,一个星期的时间我做了一个app1.0版本。现在在赶作业。以后的直播我会尽量赶上的。 ### 间接返回和异步的理解 间接返回通道: 什么是间接返回通过:间接返回通道就是在函数中开辟一个通道,用来传递数据。 例子就是:老板打电话给秘书查询航班信息,在挂电话之前把 查到的信息通过微信发回给老板。 ``` // 间接返回通道 // 采购食物的函数 function buyFoods(callback) { console.log('采购原料和菜'); var foodsList = ['fish', 'egg', 'meat']; callback(foodsList); } // 调用者的代码片段 function callback(foodsList) { console.log(foodsList); } buyFoods(callback); ``` // 直接调用 // 采购食物的函数 注意没有参数 ``` function buyFoods() { console.log('采购原料和菜'); var foodsList = ['fish', 'egg', 'meat']; callback(foodsList); } // 调用者的代码片段 function callback(foodsList) { console.log(foodsList); } buyFoods() ``` 这两个调用结果完全一样。但是调用方式却不同。 那么既然结果完全一样,为什么还要有回调函数,何不直接调用呢?既生瑜何生亮!!! 这是为了解决什么问题呢? 这是个问题,我已经提到[issue](https://github.com/xugy0926/getting-started-with-javascript/issues/407)里了 。因为就快陷入思考的胡同里去了。 > **尽管有些东西可能本身没有什么意义,但是你的思考赋予了他意义。** > 晚上又复习了下回放,看了一下你的回答,我也理解了一些。似乎这个问题不是那么重要,因为或许本身就没有什么区别,重要的是理解立即返回,和间接返回。这个我倒是理解的。 > 我想了想,其实我写的两个例子应该都是间接返回。所以看上去并无差别。因为他符合间接返回的条件:在外部定义了一个函数(间接返回通道),然后在函数内调用了一下。应该没有什么问题吧。 > 我觉得是一样的,那么问题就在于,是否把这个函数名作为参数进行传递。 > 作为参数的好处就是,他是一个形式参数,不管我外面定义的通道的名字,如何改变,我这个函数的结构都,不用更改,而如果不作为参数,一但我通道名字发生改变,那我就必须改变这个函数。 > 最重要的一点是,**如果我没定义这个参数,就等于我把函数写死了**,我自己使用可能还无所谓,作为一个使用者,没有回调函数肯定是要骂死我的。连传参数都不知道怎么传。从函数的编写者来讲,这是多么失败的函数。 我终于明白了,诸葛亮要比周瑜强很多啊。 > 我想这应该是原因所在吧!这也是深夜看回放的一些启发。 > 至于异步,我觉得把里面的函数名,通过setTimeOut函数调用一下,他应该也是异步函数吧!因为我觉得他符合异步函数的条件。因为它并没有立马执行。 > 老师说,讲间接返回是为了引出异步这个概念。异步就是用了间接返回。举了一个例子,就是调用了setTimeOut。我甚至都没有觉得,间接返回和异步有什么不一样的地方。 > 老师说,获取数据有两个方式,一个是立即返回,一个是callback.称之为回调。而这个callback,我相信指的就是间接返回,而异步就是间接返回的一个应用。与异步相对的概念,就是同步。那么我就可以把间接返回函数,也分为同步函数,和异步函数。我觉得同步与异步的差异,就是在于时间。对于耗时操作,同步间接返回函数,必须等到返回之后才能结束整个函数。那异步返回函数,则无需等待。 > 我在文中有任何理解有偏差的地方,还请老师及时指正,帮助我在错误的道路上渐行渐远。 ### 作业 1. 关于函数执行 我在flight_schedule_3更改了代码,在setTimeout函数后面添加了一句,console.log('我执行了'); ``` function checkFlightSchedule(callback) { console.log('开始查航班信息'); setTimeout(function() { // 模拟构建航班的时间信息 var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'hangzhou' }; callback(scheduleInfo.start); }, 5000); console.log('我执行了'); } //--------------------------------------- function callback(startTime) { console.log('通过反馈通道获得了信息'); console.log(startTime); } // 执行查询函数 checkFlightSchedule(callback); ``` 实时证明: checkFlightSchedule 先执行完, 然后 5秒后 才执行的setTimeout 中的匿名函数。这一点证实了异步函数和同步函数的本质区别。 ``` node flight_schedule_3 开始查航班信息 我执行了 通过反馈通道获得了信息 8/23 8:00 ``` 同样的修改之前flight_schedule_2的代码 都是同步函数案例, ``` function checkFlightSchedule(callback) { console.log('开始查航班信息'); // 模拟构建航班的时间信息 var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'hangzhou' }; callback(scheduleInfo.start); console.log('我执行完了') } //--------------------------------------- function callback(startTime) { console.log(startTime); for (var i = 0; i < 100000000; i++) { if (i === 99999999) { console.log('回调函数执行完了') } } } // 调用函数checkFlightSchedule,并塞一个回调函数以获取结果 checkFlightSchedule(callback); ``` ``` node flight_schedule_2 开始查航班信息 8/23 8:00 回调函数执行完了 我执行完了 ``` 其结果是等待回调函数执行完毕后才执行的“我执行完了”,由此可见这个间接返回也是个同步函数。 这说明,回调是同步还是异步,取决于函数本身。举例说明就是 示例中的callback 本身就是一个同步函数, 而 setTimeout 本身就是一个异步函数。 同样的 在kitchen_workflow_async.js案例中也证实了这一点,比如这个例子的打印结果是先“我要开始采购食物啦。。。。” 后 “事情安排好了,我先去洗个澡” kitchen_workflow_async这个例子感觉写的很经典,流程控制函数让整个流程让人看上去很思路很清晰。prepare在这里返回值永远为true,本身并无意义。但写入流程控制函数,就显得很有意义。很明显让我觉得有一个判断过程。而开始做事前的判断很重要。that is to say 思维,逻辑重要。一个好的流程,应当有严谨的逻辑。 2. 图片上的代码,第1行、第5行、第6行的name变量都有什么差异? 第1行,的name是函数的参数,这个参数在这里是形参,没什么具体意义。 第2行,是函数中,对这个形参的使用。这两个参数是一致的。也只有在调用赋值的时候,这些参数才有意义,才有实际的值。 第5行,是定义了name变量,并赋予了实际的值。 第6行,是调用output函数,将实际的name变量作为参数传给了函数。函数内部会有一个转换过程。也就是简单的赋值操作,name=name ================================================ FILE: homework/lesson5/huyong.md ================================================ #不同“name”的理解 ##第一行name我理解是一个参数,这个参数可以指代任何我们需要指代的对象,可以是各种不同的数据类型。 ##第五行name根据大犀牛中的定义是一个变量,这个变量是然我们可以给他任意赋值的,我们可以定义这个变量是我们想要的任何值。通过我对第五行和第六行中name变换成不同的字母代替和相同的字母代替得出来的结果来看,我的理解是,第五行中name(以下称为name5)是一个更大的范畴,意思就是这个和第一行中的name(以下称name1)相比,这个name5看作一个集合,name1是其子集,当然这个是在一个函数语句和一个var语句并列的情况下,其他有待实验 ##第六行中的name(以下称为name6)我的理解是一个确定的值,这个值完全等于var语句中给出的定义,有确定性和唯一性的属性。 ##以上就是我对不同name的个人看法,望老师指点,谢谢。 #执行各种sample的收获 1,立即调用就是直接执行一个函数,并给出信息,间接调用就是通过执行一个函数的过程中再去执行两外一个函数,并通过执行不同的函数得出不同的信息,也就是分步执行 2,分步执行就给出了更为广阔的操作空间,我们可以在不同的函数中加入各种调用,比如老师的延迟执行,比如IF语句等等,这些复杂的操作就是为了能够达到映射现实世界复杂 情况的目的, 3,函数本身即是函数也可以是对象,参数或者变量等等,所以我们在理解函数的时候要树立函数即是执行者的角色还是被执行者的角色, 在理解各代码的过程中我们需要树立调用者的角色定位,这样更易于去理解,而不能是执行者,因为小白是执行者很容易转牛角尖 4,toString()就是万能的输出啊,可以输出甲骨文吧老师? 5,run:[Function]和function()不理解,function 后面不都是该有funcname吗?还有就是kitchen_workflow_asynct太复杂了 今天搞不定了需要再看。 ================================================ FILE: homework/lesson5/jianglin.md ================================================ ###姜琳第五次课作业 ####作业 ![](https://o3b126ie1.qnssl.com/avatar/081d10a4-6e49-47a5-8f9b-ca7d48dacb78) 第1行的`name`是函数定义中的函数参数,在第2行,函数定义的内部调用对了这个参数`name`。 第5行的`name`是定义的变量,这个变量的名字是"name"。 第6行的`name`是函数output调用变量"name",值是字符串'Hello,JS'。 总之,第1行和第2行的name指的是参数,二者应该一致。第5行和第6行的name指的是变量,二者应该一致。 ####练习笔记 // 采购食物的函数 function buyFoods(callback) { console.log('我要开始采购食物啦。。。。'); // 模拟5秒后通过callback返回结果 setTimeout(function() { console.log('采购完毕'); var foodsList = ['fish', 'egg', 'meat']; callback(foodsList); }, 5000); } // 流程控制函数 function startWork() { var success = prepare(); if (!success) { console.log('还没准备好'); return; } buyFoods(function(foodsList) { cooking(foodsList, function(feast) { console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } }); }); console.log('事情安排好了,我先去洗个澡'); } 这里的callback是形参,可以说是“形式函数参数”,这个名字之所以是callback,是为了表示它的功能。而在整篇代码里,没有明确的定义callback这个函数,而是在调用的时候,直接定义了一个匿名函数,阅后即焚(感谢何伟同学的指导)。 这样做的好处,我自己的理解,一开始是以为能使代码更可读,但是在练习敲了这段代码之后,认为这种方式应该是在定义buyFoods的时候,只是定义了这个函数需要有回调的功能,但是具体怎么回调,在定义的时候不确定,这样就不唯一。然后在调用的时候,可以根据不同的调用需求,定义不同的回调函数。当然如果每次回调方式完全一样的话,那么在定义的时候就把回调函数写清楚,是更方便的选择。 ####听课笔记 - 函数定义里的变量和调用的变量完全不是一回事。 `function run(name1){console.log(name1);}` `var name = 'xugaoyang';` `run(name);` name和name1是有区别的。 - callback名字叫做**回调**,但实际上是调用一个函数去处理,和**返回**不同。 **异步**是回调的一种方式。 函数定义在哪里,都是可以使用。和位置没有绝对的关系。 function callback(){ console.log('I finished running') } function run(cb){ console.log('run run run run run'); cb(); } run(callback); ================================================ FILE: homework/lesson5/langjj.md ================================================ 下面代码中,第1行、第4行、第5行的name变量都有什么差异? 1. function output(name) { 2. console.log(name); 3. } 4. var name = 'Hello,JS'; 5. output(name); 在function定义中的name只是函数output的输入参数,可以是任意名字,只要保持第二行中使用的名字与第一行中一致即可。这是一个局部变量,不会影响到程序的其他部分。 第4行则定义了一个变量,这个变量的名字最好与编程者想要表达的意图相关,必要时用//加注释,以便理解。在给变量取名字时一定要避开JS中已有特定定义的名字,否则会出错。第5行则要求执行函数output,函数的输入值是第4行对变量进行的赋值。这里的变量是适用于整个程序的,因此具有了唯一性。 ================================================ FILE: homework/lesson5/lichen.md ================================================ 1.重点观察了`kitchen_workflow_async.js` 通过拆解的方式学到了以下知识点: ![](https://ws2.sinaimg.cn/large/006tKfTcgy1fjbbbmqgzhj30t309dgnd.jpg) 2. 图片上的代码,第1行、第5行、第6行的name变量都有什么差异?请分析差异提交你的结论。 ![](https://ws1.sinaimg.cn/large/006tKfTcgy1fjbd9avhhwj30ls09qdh6.jpg) 这个程序的输出: `Hello,JS` 第1行的`name`是函数的形参 第5行的`name`是定义的变量 第6行的`name`是调用函数的实参 统一写成`name`是为了便于阅读,和尽可能精简对变量的命名 附注: 形式参数:定义函数时函数名后括号中的变量名 实际参数:调用函数时函数名后括号中的表达式 小小观察: 程序里多定义一个变量,但不调用它,看看结果 ``` function output(name) { console.log(name); } var name = 'Hello,JS'; var color = 'blue'; output(name); ``` 输出为: `Hello,JS` 这说明一个变量被定义了但未被使用,这是一种资源的浪费,所以程序需要思考,需要设计,而不是想到哪就写到哪。当然作为小白的我们,趟一趟这些坑也是学习路上必不可少的。 ================================================ FILE: homework/lesson5/limu.md ================================================ 第一行是声明并定义了一个新的函数,大括号里是函数的内容 第五行是生命并定义了一个变量,并赋予这个变量的值为‘hello,js’ 第六行是调用了之前定义的新函数output 由于最近大学开学,一直在准备开学和军训的事情,所以耽误了好久的课程,从山东济南来到广东这边,感觉变化很大,刚来有些水土不服,拉了两天肚子,可算今天没有新生活动参加了,能来敲敲代码了,敲代码让我又有可高三时那股闷着头做导数题的感觉,一转眼几个小时就过去了,很爽。也很开心,自己进入了软件工程卓越计划班,加上暑假跟着老师学了一些编程,开学上课应该会稍微轻松些吧。 ================================================ FILE: homework/lesson5/lingxiao.md ================================================ # JavaScript 课程第5次作业 1. 【作业内容】 1. 阅读study/lesson5的sample代码,并执行观察结果。 2. 图片上的代码,第1行、第5行、第6行的name变量都有什么差异?请分析差异提交你的结论。以你命名的md文件提交。 2. 【解答】 | 代码 | 分析 | | ---------------------------------------- | ---------------------------------------- | | ![代码图片](https://github.com/LydiaLing/MyPostImage/blob/master/Js_Homework/Lesson5_pic1.png?raw=true) | 第1行是函数的自变量,是一个形参,
可以选择任何字符替换name,
而且此处的形参需要和output函数体内部的参数保持一致;
第5行是定义后的变量,代表“Hello.js”;
第6行的name就是第五行的name,是实参,实际定义的参数。 | ================================================ FILE: homework/lesson5/linxiyao-homework-lesson5.md ================================================ 图片中变量名name的差异 1.根据函数表达式: function functionName (a){ } 关键字 函数名 形参//形参可以是0或多个 得出function output(name)中的name为函数output的形参,相当于一个空壳子,还没有实际值。 2.根据声明变量,给变量赋值的形式为: var variableName = "xxxxxx", 得出var name = 'Hello,JS'中的name为一个独立变量名,且这时它被赋了值,值为Hello,JS。 3.根据调用函数的形式: functionName ( a ) 函数名 实参 得出output(name)中的name为函数output的实参,是已经被var赋过值的,值是Hello,JS 。 ps:代码还没跑,先把容易的作业交了,似乎能减轻点心里压力哈。 ================================================ FILE: homework/lesson5/lipeng-学习“异步实现一桌酒席”心得,代码难点分析.md ================================================ ## 学习“异步实现一桌酒席”心得,代码难点分析 1 **重点是间接返回** 函数们干的事没变,还是上节课切分的子任务,但buyfood和cooking 用了间接返回。buyFood和coocking 用间接返回,所以,总体上叫**异步实现一桌酒席**。 2 **代码难点- 函数变量(表达式函数定义法)** setTimeout() 里用了一层, > 把 `function(){}` 当成setTimeout的第一个参数变量: > > ```javascript > setTimeout(function() {}, 5000); > ``` > > 把要延迟执行的代码,放在`{}`花括号里: > > ```javascript > setTimeout(function() { > console.log('采购完毕'); > var foodsList = ['fish', 'egg', 'meat']; > callback(foodsList); > }, 5000); > ``` 在 `startWork()`里用了两层: 第一层,买菜,调`buyFood()`的时候, > 把`function(){}` 当成 buyFood 的回调函数变量: > > ```javascript > buyFood(function() {}); > ``` > > 然后,给回调函数添加参数 foodList, 目的要把foodList传到下一流程: > > ```javascript > buyFood(function(foodList) {}); > ``` > > 最后,把买完菜之后要执行的代码,也就是做菜函数,cooking() , 放在`{}`花括号里: > > ```javascript > buyFood(function(foodList){ > cooking(foodList, function(){}); > }); > ``` > > 可以看到,cooking() , 有两个参数,也就是foodList和 回调函数变量. 第二层,做菜,`cooking()`的回调函数变量 > 把`function(){}` 当成 cooking() 的回调函数变量: > > ```javascript > cooking(foodList, function(){}); > ``` > > 然后,给cooking的回调函数添加参数 feast, 目的要把feast传到下一流程: > > ```javascript > cooking(foodsList, function (feast) {}); > ``` > > 把做好菜之后要执行的代码,也就是上菜console.log('----酒席准备好了----'),放在`{}`花括号里: > > ```javascript > cooking(foodsList, function (feast) { > console.log('----酒席准备好了----'); > for (var i = 0; i < feast.length; i++) { > console.log(feast[i]); > } > }); > ``` > > 最后,把第二层构建的做菜代码,放在买菜回调函数花括号里`{}` 从这样: ```javascript buyFood(function(foodList){ cooking(foodList, function(){}); }); ``` 变成这样: ```javascript buyFoods(function (foodsList) { cooking(foodsList, function (feast) { console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } }); }); ``` ### 3 总结 函数变量,写法比较复杂。我拆了几遍,弄明白了。 “定义一个函数变量(表达式函数定义法)”,是把一个函数的定义代码,function(){} ,直接当成一个变量用。 > 第四课sample代码用了两次: > > [使用函数创建对象](https://github.com/xugy0926/getting-started-with-javascript/blob/master/study/lesson4/build_a_human.js) `var buildPerson = function(){}` > > [士兵对象有报数方法](https://github.com/xugy0926/getting-started-with-javascript/blob/master/study/lesson4/sound_off_3.js) `soundOff:function(){}` ================================================ FILE: homework/lesson5/lipeng.md ================================================ 1 ```javascript function output(name){ console.log(name); } var name = 'Hello, JS'; output(name); ``` 第1行 `name`为 函数output声明的参数变量。 第5行、name 为定义的一个叫做name的字符串变量,并且赋值'Hello, JS' 第6行,name 为第5行定义的 name 字符串变量,在调用output函数时,被当做参数传进去。 ================================================ FILE: homework/lesson5/liujuanjuan1984.md ================================================ # JS编程入门Lesson5作业 by刘娟娟 分析这段代码,说明每个地方的name都是什么含义。 ''' function output(name){//定义一个函数,函数名叫output,它需要一个参数,我们以name标记这个参数,用来说明在这个函数里我们如何使唤这个参数 console.log(name);//在这个函数中,我们需要对这个参数name做console.log的处理 } var name = 'hello,js';//申明一个变量,变量名叫name,并把'hello,js'这个字符串赋值给这个变量name output(name);//调用函数output,并把上一行变量name的值作为参数传给这个函数,让这个函数去工作 ''' 老师这个例子还不够绝的,我拓展下:_步子迈大了,收不回腿了..._ ''' var name = 'liujuanjuan'; //申明一个变量,变量名叫name,把'liujuanjuan'这个字符串赋值给它 var liujuanjuan = { //申明一个对象类型的变量,这个对象名名liujuanjuan name:'liujuanjuan' //这个对象有一个属性,这个属性叫name,这个属性的值是'liujuanjuan' }; console.log(name); //打印变量name的值 console.log(liujuanjuan.name); //打印对象liujuanjuan的name属性的值 function liujuanjuan(name){ //定义一个函数,函数名叫liujuanjuan,有一个参数为name console.log(name)//打印这个参数的值 } liujuanjuan(name); //调用函数liujuanjuan,参数为第一行变量name的值 liujuanjuan(liujuanjuan.name); //调用函数liujuanjuan,参数对象liujuanjuan的name属性的值 ''' 打印出来的结果一定很令人摸不着头脑。改进一下,做个标记: ''' var name = 'liujuanjuan1'; //申明一个变量,变量名叫name,把'liujuanjuan'这个字符串赋值给它 var liujuanjuan = { //申明一个对象类型的变量,这个对象名名liujuanjuan name:'liujuanjuan2' //这个对象有一个属性,这个属性叫name,这个属性的值是'liujuanjuan' }; console.log(name); //打印变量name的值 console.log(liujuanjuan.name); //打印对象liujuanjuan的name属性的值 function liujuanjuanF(name){ //定义一个函数,函数名叫liujuanjuan,有一个参数为name console.log(name)//打印这个参数的值 } liujuanjuanF(name); //调用函数liujuanjuan,参数为第一行变量name的值 liujuanjuanF(liujuanjuan.name); //调用函数liujuanjuan,参数对象liujuanjuan的name属性的值 ''' ## 这个案例的教训是,对象的名字和函数的名字不要重名。 ================================================ FILE: homework/lesson5/liujun.md ================================================ # name变量的差异: ## 第1行name变量:是function output的参数,可以name,name1,或者是空值,都可以。之所以根下面的name一致,是为了代码易读和便于维护。 ## 第5行的name变量:是声明了一个叫name的变量,并赋值‘Hello,JS’给了它,它是一个全局变量。可以任意调用。 ## 第6行name变量:是把第5行定义的变量的值‘Hello,JS’给到了函数output. ================================================ FILE: homework/lesson5/liuliyuan.md ================================================ ##Lesson 5作业 ###1. 阅读study/lesson5的sample代码 1. indirect_call.js // 最简单的间接返回 2. async_function.js // 最简单模拟异步的技巧 **3. flight_schedule_1.js // 立即返回案例** >情景: >老板:查一下航班时间,不挂电话,查到直接给结果 >秘书:。。 >秘书:明早8点 >老板:好的 转化成代码: 如果老板让你帮查航班时间,一般的流程是先跟老板说我知道啦,开始查,然后查到信息,把起飞时间告诉老板,所以就先定义一个函数,表示一下这个流程,也就是checkFlighSchedule函数;今天就碰到这样的情况,老板打电话给秘书让查航班时间,老板发了一个starttime的需求,你就把这个跟你的函数对应起来,最终得到结果。 **4. flight_schedule_2.js // 间接返回案例** >情景: >老板:查航班信息,不挂电话,查到微信给我结果 >秘书:。。 >秘书:(发微信)明早8点 >秘书:老板,微信发给您了。 >老板;好的 转换成代码: 这里多了一个老板要求你用微信发给他,也就是规定了数据返回的一个通道。所以在checkFlightSchedule中,在说我知道了,查到时间结束后,还需要用老板要求的callback的函数发给他。所以就要写出老板定义的那个callback函数。所以,最后执行checkFlightSchedule,代入callback的函数参数。 **5. flight_schedule_3.js // 异步处理案例** >情景: > >老板:查一下航班信息,查到维信告诉我 > >秘书:。。。 > >秘书:查完了,喝口水 > >秘书:发微信(明早8:00) > >老板:(维信收到消息)明早八点,现在回去收拾行李 转化成代码: 跟之前不一样的是这里不需要老板在线等着,而是互相各自做不同的事,等秘书回复老板的事后,老板再根据此继续做事情。 站在调用者(老板)的角度,也就是说callback给我反馈之后,我再去看时间,所以对比间接返回,这里多了一行代码,就是console.log('通过反馈通道获得了信息'),这样调用者就可以在调用反馈之前的这段时间做别的事,而不是在线等待。 **6. kitchen_wordflow_async.js // 异步实现一桌酒席** ###2. 下面代码中,第1行、第4行、第5行的name变量都有什么差异? function output(name) { console.log(name); } var name = 'Hello,JS'; output(name); 第1行中的name是函数output的参数; 第4行是定义一个变量name,并赋值'Hello,JS'; 第5行的name是output函数执行时传入的参数名称,4、5行两行可以缩减为output('Hello,JS'); 老师作业的目的在于让我们了解定义函数与执行函数时参数的区别,也就是犀牛书中所写的形参和实参的区别。 ================================================ FILE: homework/lesson5/liuruyong.md ================================================ # 下面代码1,5,6行name差异 function output(name) { console.log(name); } var name = 'Hello,JS' output(name) 第1行name,函数的参数名 parameter 第5行name,字符串类型变量 第6行name,给函数的参数赋值,函数参数实际表示的值,argument ================================================ FILE: homework/lesson5/liushengxin.md ================================================ # 第五节课代码分析 1. function output(name) { 2. console.log(name); 3. } 4. var name = 'Hello,JS'; 5. output(name);` 第1行、第4行、第5行的name变量都有什么差异? 第1行的name是异步调用的一个变量或者函数、表示的调用的后面的一个叫name的能满足一定功能的变量或者函数。 第4行的name是一个变量、var语句将Hello,JS这个代码内容赋值给name 第5行的name是将第4行的name变量进行输出操作,也就是输出 Hello,JS ================================================ FILE: homework/lesson5/lixiang.md ================================================ # Ideal's Homework (Lesson5) 标签(空格分隔): 未分类 像学英语一样,遇到不会的单词就查词典,遇到不会的语法就查语法书。四行代码,学好久。。。 ---------- 【function】 --------- **什么是函数?** JavaScript的数据类型分为: 1. **Primitive Type**: 数字、字符串、布尔值、Null、Undefined 2. **Object Type**:Array、**Function**、Other Classes 一言概之:函数是JavaScript中一种重要的特殊对象 --------- - **函数声明(function declaration)** > - function [name] (parameter) {statements;} #### 1.function是关键字 #### 2.[name]可以省略,省略后的函数叫做匿名函数(anonymous function) #### 3.()里可包含0-255个参数(parameter,形参) #### 4.{}里面的内容叫做函数体(function body),包含0-多条JavaScript语句,语句的数量不限,每个语句用分号进行分隔 ;花括号是必须的,不可以省略; #### 5.和var Ideal = "lixiang" 声明一个变量必须以var开头一样,声明一个函数必须以function开头 比如: ```JavaScript function calculateAdd(x){return x+1;} //calculateAdd 是函数名;x是形参;return x+1是函数体; ``` - **函数表达式(function expression)** > - var 变量名 = function [name] (parameter) {statements;} 函数声明和函数表达式的语法很像,但有一个**重要的区别**: **声明语句**会“被提前”到顶部,也就是可以被在它出现位置之前的代码调用; 而用**表达式方式定义**的函数在被定义之前无法被调用。 PS: 这也是老师在讲函数调用的时候,为什么有一些代码物理位置出现在比较靠后的位置,但是前面的代码需要它的时候依然可以调用。 ---------- 【output】 --------- 根据上一节的内容,第1行的"output"是一个函数的名字,如果省略了则是匿名函数; 第6行的"output"则是函数调用四种办法的第一种:作为函数调用,第6行是调用表达式。由 函数名+括号+传入的实参值(实参的英文是argument) ---------- 【name】 --------- ```JavaScript function output(name){ console.log(name); } var name = ‘Hello,JS’; output(name); ``` #### 第1行的name: 形参 #### 第2行的name: 函数语句,打印函数接收到的值 #### 第4行的name: 定义一个变量 变量名字是name 变量的值是Hello,JS #### 第5行的name: 调用表达式里面的name是一个实参,接受第四行得到的变量name的值,传入函数,执行,得到最终的结果‘Hello,JS’ ================================================ FILE: homework/lesson5/luoruijun.md ================================================ # 第5课作业 分析代码 1. 第一行的变量name是函数output的参数,只是说明此函数需要一个什么参数,定义函数时设计此参数如何参与运算,参数是什么名称(name\name1/myname)都不影响运算情况和结果。 2. 第五行的变量name:定义一个名称为name的变量,并赋值为‘Hello,js’。 3. 第六行调用output函数,此时output()内的参数使用第五行定义的变量name,其值是' Hello,js',此变量实际进行运算,和第一行、第二行的name是不一样的。 ================================================ FILE: homework/lesson5/maggiewong.md ================================================ 作业1.代码执行截图 ![作业5-1](E:\xinsdx\JavaScript\作业5-1.png) ![作业5-2](E:\xinsdx\JavaScript\作业5-2.png) ![作业5-3](E:\xinsdx\JavaScript\作业5-3.png) ![作业5-4](E:\xinsdx\JavaScript\作业5-4.png) ![作业5-5](E:\xinsdx\JavaScript\作业5-5.png) ![作业5-6](E:\xinsdx\JavaScript\作业5-6.png) ![作业5-7](E:\xinsdx\JavaScript\作业5-7.png) ![作业5-8](E:\xinsdx\JavaScript\作业5-8.png) ![作业5-9](E:\xinsdx\JavaScript\作业5-9.png) ![作业5-10](E:\xinsdx\JavaScript\作业5-10.png) **总结:**作业刚开始做的时候终端运行一直有错误,在网上查了之后也没有解决问题,心态就浮躁了很多,想着欠下很多作业怕赶不上进度。在群里问了之后同学们帮忙看了一下出问题的地方的截图提出了修改建议: 1.文件先保存一下再在终端运行否则容易出问题,文档名字旁边有点说明有改动未保存,可以打开菜单栏里的自动保存。 2.要先打开文件保存的路径,路径写法要规范,斜杠是/而不是\。这里去查了一下绝对路径和相对路径,何伟同学一边操作并截图一边详细讲解举例才搞清楚了概念。想起之前Python的课程里提到过更改文件保存的路径,稀里糊涂没有搞清楚路径的正确写法操作失败,因为老师说不是课程重点了解即可就给自己找借口没有吃透概念,现在被绊倒在同一个地方,深知学习不能糊糊涂涂的,基础的东西一定要吃透,不然还会在别的地方吃亏。 3.路径的问题解决了之后又出现了module not found 和syntax error的问题,排查原因后才发现是因为粗心分别忘了把文件送给node运行和跟着视频打代码时忘了把var改成function。visual studio code用红色波浪线划出了有问题的代码,但是对代码的含义没有吃透的话也难以察觉错误。 遗留问题,代码里跑步的表情不知道怎么调出来的,直接从老师的课件里copy过来了。。。 作业2: 第一行的name变量是做用作参数判断,第五行的name变量是定义一个变量并给它赋值为‘Hello, JS’,第六行的name变量是用作返回结果,第一行和第六行的name变量对应的值是一样的。 ================================================ FILE: homework/lesson5/marshalcy.md ================================================ ### 作业1 function output(name){ console.log(name); } var name = ‘hello,js’; output(name); 第一行的name是一个形式上的参数, 第五行的name是一个变量,这个变量的名字叫name, 第六行的name是实际的参数, 第二行的打印name,就是第一行传入第六行实际的参数name的值,值是第五行变量的hello js。 ================================================ FILE: homework/lesson5/oyanagchun的作业 ================================================ ================================================ FILE: homework/lesson5/panyong.md ================================================ # 第五次课作业 ## 作业 1. 阅读study/lesson5的sample代码 ``` sample代码演示了 1、直接调用、间接调用、异步函数的使用 2、string、object、number、boolean、array数据的使用。 ``` 2. 下面代码中,第1行、第4行、第5行的name变量都有什么差异? ``` 1. function output(name) { 2. console.log(name); 3. } 4. var name = 'Hello,JS'; 5. output(name); ``` 差异就是,第4行 `var name = 'Hello,JS'` 是定义了一个name变量,后续的代码中都可以使用这个变量。第5行`output(name)`就是在使用第4行定义的name变量。第1行`function output(name) {`这里的name是,函数的参数,只在函数内部有效。 ## 听课笔记 课程惊喜:送手环。以github开源为例,说明时间是宝贵,互相帮助是件非常有意义的。 ## 浏览器与服务器的顺序图 画图很重要。画图工具: [ProcessOn](www.processon.com)、`Visio`。 ## 前端交互实现的关注点 ``` 1、用户html的交互 2、html与js的交互 3、js与服务器的交互 ``` ## 函数内部怎么写 上节课主要讲了把生活场景映射为代码的思路,用函数来表达流程(老师重点演示了办一桌酒席的顺序图)。这节课,主要将函数内部如何写。 1、参数判断 2、逻辑处理 3、返回结果 ``` 立刻返回 / 间接返回 立刻返回: 用return 间接返回: 就是调用函数时,参数中传入另一个函数,用传入的这个函数来间接处理数据。这里的间接返回,也就是callback回掉函数。 ``` ## 异步 ``` setTimeout(callback,5000); // 5秒后,调用callback函数 ``` ## 小结 很喜欢徐老师的课。我其实是计算机科班出生,学过C/C++/Java,只是没好的机会去工程岗位上锻炼,回老家当了老师。老师的每节课我基本上都听了两遍,一遍是听老师讲了什么,第二遍是听老师如何教的(会对比以前老师是怎么教的,如果是我教呢?)。 跟着徐老师的课,到目前为止最大的收获是git的使用,办一桌酒席案例中蕴含的编程思路,还有js中把函数作为参数传入的用法。一般的编程课,就是在讲语法,讲数组,讲循环...... 老师的课,这些基础语法都没做重点讲,而是在讲真正重要的东西,编程的思路,函数的写法与调用方法。想想,初学编程时能听到这样的课,真的是太幸运了。 由于课程回放有时间限制,后续自己要调整出更多时间来学习来练习,同时,也期待老师后续的课。 ================================================ FILE: homework/lesson5/qiujingyu.md ================================================ 【作业内容】 1. 阅读study/lesson5的sample代码 2. 下面代码中,第1行、第4行、第5行的name变量都有什么差异? ``` 1. function output(name) { 2. console.log(name); 3. } 4. var name = 'Hello,JS'; 5. output(name); ``` 【解答】 第1行的name是函数的形参,是函数体的局部变量。 第4行的name是定义的全局变量,是第5行name的值。 第5行的name是第一行函数的实参,第1行的形参name可以变成abc等,不会影响结果。 > 函数调用会为形参提供实参的值。函数使用它们实参的值来计算返回值,成为该函数调用表达式的值。 【体会】 突然蒙了一下,忘了什么是变量,哈哈。 > 变量是一个值的符号名称,可以通过名称来获得对值的引用。变量的工作机制是编程语言的另一个基本特性。 ``` console.log(1); function output(name) { console.log(2); console.log(name); console.log(3) } console.log(4); var name = 'Hello,js'; console.log(5); output(name); console.log(6); ``` 按照老师说的比较low的方法来调试,得到的结果是 ``` 1 4 5 2 Hello,js 3 6 ``` 这样确实比较容易理解。 ================================================ FILE: homework/lesson5/readme.md ================================================ 今天的间接返回的处理手法理解上会有难度,而这就是js最难的部分。后面的所有课程都是在使用这些技巧来处理代码流程。完全不用担心现在的懵逼状态。 把作业做好。 【作业内容】 1. 阅读study/lesson5的sample代码 2. 下面代码中,第1行、第4行、第5行的name变量都有什么差异? ``` 1. function output(name) { 2. console.log(name); 3. } 4. var name = 'Hello,JS'; 5. output(name); ``` 【提交方式】 1. 请向getting-started-with-javascript项目发起pull request。 https://github.com/xugy0926/getting-started-with-javascript 3. 提交homework/lesson5目录下。 4. 以自己的名字命名md文件提交。 5. ================================================ FILE: homework/lesson5/shaozhen.md ================================================ ### 第一行的name是局部变量,只能在函数内部访问它,只要函数运行完毕,局部变量就会被删除。 ### 第五行的name是全局 JavaScript 变量,在任何位置都可以访问。 ### 第六行的name是函数的参数,在调用函数时,可以向其传递值 ================================================ FILE: homework/lesson5/shenzhili.md ================================================ #第五节课作业: **代码中第1行、第4行、第5行的name变量有什么差异?** ```javascript function output(name){ console.log(name); } var name = 'Hello, JS'; output(name); ``` 第一行的name是function函数中的变量(形参)。调用函数时,函数体用形参进行逻辑处理(计算),之后再将实参传入形参,得出结果。 第四行声明了一个变量,变量名为name,随后赋值给它"Hello,JS" 第五行的name是第四行的变量,此时,name是作为一个实参传给函数去做处理。 **从作用(性质)上来看:** 第一行:函数的变量(名),形参(parameter) 第五行:变量(名) 第六行:变量(名),作为实参传入函数。 **从值来看:** 第一行:只是形参,内部没有数据,需要被赋值。 第五行:变量值="Hello,JS" 第六行:变量值="Hello,JS" ================================================ FILE: homework/lesson5/sophieQi.md ================================================ 代码中第1行、第4行、第5行的name变量有什么差异? ```javascript function output(name){ console.log(name); } var name = 'Hello, JS'; output(name); ``` 第4行 变量名为name。 第1行定义函数为name,也可以是其他的名称,比如name1,相应的第二行也要改为name1。 第5行,name为执行对象。输出name的值。 ================================================ FILE: homework/lesson5/sunyan.md ================================================ # 作业 声明:按代码从上到下的顺序,分别把三个name称为name1、name2、name3。 1.name1是函数output声明所需要的参数,如果按照老师的“声明 → 定义 → 赋值”三步骤来说的话,此时name1只是被声明了,再结合output函数对name1的用法来看, 此时它可能是任何类型的数据,number、string、object...都可以。 2.name2是声明定义了一个变量,并给它赋予‘Hello,JS’这样一个具体的值。 3.name3就是把name2作为一个参数拿给output函数使用 (即name3其实就是name2,假设name2的命名发生变化“name2 → hello”,那么name3也得跟着变才行“name3 → hello”), 这也相当于给name1定义和赋值,此时name1的值就为name2,数据类型为string。 之后再次调用output函数时,我们还可以给name1赋予不同的值name4、name5...name_x,name1的数据类型也可能随之改变,当然函数的运行结果也会跟着改变。 # 一个疑问 ![](https://ws2.sinaimg.cn/large/006tKfTcgy1fiw3x4c7zoj30rs0fndsz.jpg) 图1——方便理解问题的截图 ![](http://ww2.sinaimg.cn/large/006tKfTcgy1fiw39xr971j30m805s0tz.jpg)
图2——再次运行,查看到的情况的确是console.log('事情安排好了,我先去洗个澡')这句代码,在那5秒的间隙里先运行了。 【疑问】如果从正确表达“做饭流程”这方面来说,这样的代码算不算有问题? ================================================ FILE: homework/lesson5/tangjianfeng.md ================================================ ##Homework of lesson5 第1行、第5行、第6行的name变量都有什么差异?请分析差异提交你的结论。 function output(name) { console.log(name); } var name = 'Hello,JS'; output(name); 第一行的name是定义run函数的一个参数,这个参数和第5、6行的name不是同一个东西,第5行的name是被‘Hello,JS'这个字符串赋值的一个变量,然后第6行的name就是把第5行的字符串当参数调进函数output(name)中,这样打印出来的就是‘Hello,JS’ 用自己的话说就是function output(name)就是在自定义一个函数,也就是做一个自己的工具,当在name参数的位置放一个变量进去的时候,就会打印出这个变量,第1行的name这个参数就算命名成mingzi也无所谓,只要下面的console.log的括号中的参数也变成mingzi就可以了,即console.log(mingzi); 而第5行的name也可以变成其他的名字,例如myName,只要下面第6行的output中的括号中的内容也写成myName,就可以了。说到底,真正重要的是function output(name)这个函数是怎么定义的,变量名倒不是重点,当然最好能命名得清楚些,例如有些函数的参数必须要数组的,那就把参数变量名写成myArray这种名称,这样就容易让人理解,否则很容易会被人传个字符串或者整数这种不合适的参数传进去,这样就不好了。 ================================================ FILE: homework/lesson5/taobao.md ================================================ # lesson5_第五次作业_understandingOfName ``` 1 function output (name){ 2 console.log(name); 3 } 4 5 var name = "Hello, js"; 6 output(name); ``` --- Fidn the "name" different between line 1, 5 and 6. For the whole code, build the funtion with name "output" and when run function output, it needs get parameter, then the result of function output is print the parameter what it got at beginning. Moreover, for the line 5, it varable name and delimit "Hello, js". In line 5, the "name" is the name of one varable. In line 6, it is run output function and send the parameter which name is "name". I think this homework is similar with sample code, indirect_call.js. --- 第一行, name 是作为一个接收参数,传入function output() 中,function 将传入的参数打印出来。 第五行, name 是一个变量的名称,即声明变量name ,然后定义。 第六行, name 是一个参数被传入,当运行output() 这个 function 的时候。 ================================================ FILE: homework/lesson5/wangchangqing.md ================================================ ## 问:图片上的代码,第1行、第5行、第6行的name变量都有什么差异?请分析差异提交你的结论。以你名字命名的md文件提交。 ![mark](http://ou7elf9tx.bkt.clouddn.com/blog/170903/d113EmK15J.jpg?imageslim) 第1行的name是一个**“形式变量”**。在这里并没有什么实际的含义,只要和下文中的“XXX”保持一致即可,都可以传达出“这是一个输入什么,就可以输出什么的函数”这么一个意思。 第5行的name是一个**等待被赋值的变量**。在这里,它被赋值为<'Hello,JS'>。 第6行的name是一个**已经被赋值的“实际变量”**,正在被输入函数output中,经过逻辑处理,获得结果。 **结论:** 在定义函数时,变量叫什么名字不是特别重要,因为这个时候它没有实际的含义,只是一个用来解释“这个函数如何处理数据”的**工具**和**象征**。 当实际调用这个函数时,需要先对函数所需要的变量或者参数赋值,然后将赋值后的变量代入函数之中,以求得最终的结果。这个时候,变量的名字和值就很重要了,因为名字反映了它的用途和意义,而它的值直接决定了我们能否得到想要的结果。 ================================================ FILE: homework/lesson5/wangwei.md ================================================ ## 1. 阅读study/lesson5的sample代码,并执行观察结果。 > #### 已阅读 ## 2. 图片上的代码,第1行、第5行、第6行的name变量都有什么差异?请分析差异提交你的结论。以你命名的md文件提交。 > ![](https://o3b126ie1.qnssl.com/avatar/081d10a4-6e49-47a5-8f9b-ca7d48dacb78) >> #### 1. 第5行和第6行的`name `是 同一个` name `, 第5行是对 声明 定义一个变量` name `, 并把字符串 `‘Hello,JS’` 赋值给`name` >> #### 2. 第1行的`name`和 第5行 第6行 不是同一个`name`, 他的 作用域 只在 函数`output()` 里面,在第6行调用函数`output(name)`时, 把第6行`name`的值,赋值给 第1行的`name`, 他是值的一种传递吧。 ================================================ FILE: homework/lesson5/wangyunfei.md ================================================ ## Lesson 5 关于函数的感悟 ### 一、 从第四节课开始,老师陆陆续续引用例子,从“军训报数”,到“做一做酒席”,再到“查询航班信息”,都是为了引出JavaScript中最最最重要的数据类型-----函数。 并通过“不同的查询航班信息案例” 来引出“立刻反回”与“间接反回” ,并最终引出异步函数。 通过案例,确实能够深刻的理解 “立即” “间接” “异步”,这三个中文的名词概念,可是真正引入到JS函数中去,确实一时半会转不过来弯,包括此时此时仍然迷茫。 ### 二、 先来说说函数,啥是函数? 经过百度,引用某版主的释义:“函数就是包裹在花括号中的代码块,可以在某事件发生时直接调用函数(比如当用户点击按钮时),并且可由 JavaScript 在任何位置进行调用。” 其实这句话说跟没说一样,我要的是大白话,心碎ing...... 创建函数有三种方法? ①、构造函数 var name=new Function(...) ②、函数表达式 var name= Function(...) 虽然版主说,构造函数与函数表达式有区别,并作出了解释,但是实际上,除了少个new,我还是没觉得有啥区别。 ③、函数声明法 function name(...){...} 函数声明法,没有声明关键字“var”,也没有“等号”,看上去,有些怪怪的,确实是没有 var name=“小明”,来的直接。 但是确实最常用、最高效的函数创建方法。因为,构造函数和函数表达式存在变量提升的问题。而函数声明不存在这个问题,无论在何处调用都可以。 (其实,我也不懂,啥叫变量提升,查了一圈,也没搞懂....,爱啥啥吧,不管它了。) ### 三、 有了函数声明法的构造,结合构造去了解函数,function name(...){...}。 “function” 这个单词在英文中,就是“函数”的意思,同是“function”也是在“函数声明法”的关键字,“function”后紧跟名字,又叫“函数名”。 函数名后先跟小括号“( ) ”,小括号里的内容是添加参数用的。 小括号后面的花括号{...},这里面装的就是各种各样的代码块。具体代码块是什么东东,正在研究中.... ### 四、 开始研究案例,这个案例同是也是是老师留的Homework, #### 案例(一) function output(name){ console.log(name); } var name= "小明" output(name); 短短几行代码,一共出现了4次"name"。 node下运行结果为:“小明” 为啥结果是“小明”呢? 咋一看,因为 var name=“小明” ,“name” 又被“output” 函数给调用了,所以name输出结果肯定是“小明”。 ### 其实不然 继续分析案例,将语句稍作更改。 #### (案例二) function output(name){ console.log(name+'同学'); } var name= "小明" output(name); 在node下运行,得到的结果是 “小明同学”。 可能有很多人蒙圈,确实,我一开始也蒙圈,明明 var name=“小明”,这个定义没变啊,咋就成了“小明同学”了呢? ### 稍等片刻,我将案例再做修改。 #### (案例三) function output(mingzi){ console.log(mingzi+'同学'); } var name= "小明" output(name); 案例总共该了两次。 第一次我将第二行:“console.log(name);”,改成“ console.log(name+'同学')”。 第二次更改,我将“function output(name),” 改成“function output(mingzi)”。 至此,5行代码中,“name”出现的频率只有两次,分别是 var name= "小明" 与 output(name)。 将第三个案例,再一次运行,结果仍然是 “小明同学”。 ## 五、总结 在函数中,一个函数名在定义时,小括号里面输入的参数,是一个虚拟的参数,或者说是一个没有任何值的参数。并非是调用了一个已有的变量,来作为参数。它是个一个“虚拟的参数”。 这个虚拟的参数只有在调用者,调用“别人家的量”时(这个“别人家的量”可以是函数,变量,总之就是一个实际存在的量),。 这个“虚拟的参数”才能接收到“别人家的值”。这个“虚拟参数”也叫做“形式参数”,当“形式参数”收到值后,才能进行一系列的运算,比如:“name+'同学'”。 同理,“别人家的量”,指的是函数、变量、语句等。本文中,指的是 var name= "小明",这句话中的 “name”。 这个“别人家的量”称之为“实际参数”,简称实参。 #### 再一次回到第一个例子 function output(name){ console.log(name); } var name= "小明" output(name); 这个例子中,如果函数“output”不调用 var name= "小明” 这句话中的name变量,也就是把“output(name);这一语句删掉, 那么 function output(name)与{console.log(name;} ,这一句中的两个“mame”,它俩永远都不知道自己叫“小明”。 output(name);表示调用“实际参数”,也就是调用 “var name= "小明"”,中的 name 变量。 调用完之后,把“小明”这个值,悄悄的告诉 function output(name){console.log(name+'同学');} 中的两个"name", 这个两个“name”收到值后,才开始计算,name+'同学',于是就有了:“小明同学”。 例子中的output(name),name这个单词,就是起到一个接收作用,把这个name改成阿猫、阿狗,只要 var name= "小明"不变化,然后发生函数调用,结果依然是“小明同学”。 ## 六、题外话 还是上例子: function output(name){ console.log(name); } var name= "小明" output(name); 这个例子中,如果把 变量“name”的值发生表更, 即:var name='小李', 其他不变,结果就成了“小李”,因为调用的依然是变量“name”,不管第四行中的name值如何变。 可是如果在函数体内,即花括号内{ },对name进行变更,结果值就会发生变化。 直接上例子: function output(name){ var name=“小花” console.log(name); } var name= "小明" output(name); 再次运行后,发现结果跟小明没关系了。结果是“小花”,因为函数内的“var name” 与函数体外的 "var vame",他门的作用区域是不相同的,且被调用的顺序也不同。 其实第四、五节课,重点的重点就是同步函数、与异步函数。我不断的尝试更深次的了解它门,并且想总结出自己的理解,但是发现掌握的知识太碎片化,很难串联起来,脑海里很难形成一个成型的同步与异步的概念。 我感觉到,如果想深入了解同步与异步函数,必须要对其基本的知识点掌握透彻,然后不停的修改同步、异步的相关代码,反复执行,然后再看别人的文档,才能有所感悟。 同步函数、与异步函数,确实很烧脑,我正在琢磨中,不知道还要琢磨多久,也许需要很久,但是我愿意去尝试。 就像在在琢磨他们的时候,初步了解了什么叫形参与实参,并且知道他们的差异,与原理。这就是收货。 ### 每一个人都必须按照他自己的方式去思考;因为他在自己的道路上,就会发现能帮助他度过一生的一条或者一种真理。但是他切不可放任自己;他必须克制自己,光有赤裸裸的本能是不行的。 ——歌德 ================================================ FILE: homework/lesson5/wangzhongbin.md ================================================ ###### 题外话 迟来了两周的作业。 上周旅游,周末和周一二都去了外地。 本想着,背电脑去,晚上有时间敲敲代码。 但又想:出去玩,还背电脑,夜里又"啪啪啪"键盘,貌似也不对劲。 结果没带,好后悔。 晚上,看群里讨论得热闹,只能干看,(⊙﹏⊙) b,想敲敲代码,拿着手机很不舒服,于是放弃,觉得自己做错了选择。 教训:电脑外出要背着,不能嫌沉,不能在意别人的眼光,不论走到哪里,都要时刻准备着——敲代码。 Ps:因为作业是听了老师后来讲的,还有周五补的课程,加持了这三节课的威力,我对代码的执行的理解有了质的提升,^^(我感觉)。 --- ## 一、lesson5 sample代码的解析 这2周老师,带领我们这群小白,理解函数。 虽然老师讲了那么多,但对异步、直接返回,我依然有些懵,不过也稍微理解了一些。 ### 从函数的定义开始 函数是啥,就是你给它一个参数,它经过特殊处理,返回结果的算式。 所以一个函数里面有3个很重要的元素(函数名也很重要): 1. 参数 2. 表达式(算式) 3. 返回的结果 这三个元素,针对不同情况,就分出来很多不同类型的函数。 **回调函数** 假如,一个函数A的参数B,不是一个值,而是其他的一个函数,即函数A的参数B **是一个函数**。 那么,B是回调函数。 当运行A的时候,运行到了需要用到B时,会跳到B里面,运行B,得出一个结果,再返回到A里面继续运行。 **异步函数和直接返回** 这是针对返回情况,而产生出的两种不同函数。 直接返回的函数是,当你运行到了这个函数时,必须要等待这个函数给出一个结果,它才运行下一行,否则它就会一直卡在那里。 异步函数呢,当电脑运行到了异步函数这一行时,会先跳过它,运行它之后的代码,当异步函数运行完了之后,返回一个结果。电脑不会卡在那一行。 ### 作业2 name变量有什么差异? ``` 1. function output(name) { 2. console.log(name); 3. } 4. var name = 'Hello,JS'; 5. output(name); ``` 第一行的name,是函数output() 的参数,name作为参数变量,并无实际意义,name也可以是a,b,c…… 然后,第二行的命令是把参数变量name打印到屏幕上。 此时,都是在定义函数output()。 然后第4行,是声明了一个变量,定义变量名为name,并赋值它name = 'Hello,Js',是个字符串,此时name是变量,是有意义的; 然后,把name这个变量传给了函数output(),运行output(name); ### 做菜函数解析 粗看之下,老师一直使用callback回调函数,但找了半天也没有找到定义callback函数的语句,试运行了下老师的代码,居然是还没有准备好……后来我又运行了一次,发现又多了一行,后来过了很久,又看时,居然成功了,(⊙﹏⊙)b。 ![](http://othyo5zr8.bkt.clouddn.com/17-9-2/99985079.jpg) ![](http://othyo5zr8.bkt.clouddn.com/17-9-2/66115860.jpg) 好吧,如果是上周,我傻了,而且束手无策,现在是有些懵,不过幸好是听过了周五的补课,有解决方法。 ##### 查找原因 代码的上半截都是定义函数,执行是从调用开始。 ``` startWork(); // 是最开始执行的函数,找到它。 // 然后startWrok()执行, function startWork() { var success = prepare(); if (!success) { console.log('还没准备好'); return; } // 不懂!success是什么意思。 ``` ![](http://othyo5zr8.bkt.clouddn.com/17-9-2/21540839.jpg) 只执行到了if语音,因为if函数里面有一个return,也就是直接结束了startWork()函数,所以第一次运行是,运行了if里面的语句,(!success)成立了; 但是第2次运行之后,发现if语句不成立了,(⊙﹏⊙)b,就几秒的时间。 ![](http://othyo5zr8.bkt.clouddn.com/17-9-2/85398330.jpg) 好吧,究其原因,是因为不懂!succsss是什么意思。 一开始不成立,后来又成立了,翻了同学的作业,又百度了一下。 发现,!success 是指 success !== true,即success是false时,就执行if语句。 回看,prepare()函数,里面有一个随机函数。好吧,故而success时而成立,时而不成立。 这个解决后,继续看下去。 ##### 第二个难点。 当preapre()函数是ture时,执行了buyFoods()函数。 ``` buyFoods(function(foodsList) { cooking(foodsList, function(feast) { console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } }); }); ``` 找到buyFoods()函数,它的变量是一个回调函数:callback(); 先执行第一行: ``` function buyFoods(callback) { console.log('我要开始采购食物啦。。。。'); // 模拟5秒后通过callback返回结果 setTimeout(function() { console.log('采购完毕'); var foodsList = ['fish', 'egg', 'meat']; callback(foodsList); }, 5000); } ``` 接下来是一个setTimeout()函数,是异步函数,跳过它,bufFoods()函数先放一边,先执行其他代码。 执行了53行的代码: ```console.log('事情安排好了,我去洗个澡')``` 等待setTimeout生效,执行setTimeout()里面的语句。 * 第7行代码; * 第8行代码,赋值foodsList; * 第9行代码,同时执行有参数的回调函数callback(foodsList),找callback()函数的表达式; * 第44行代码是callback()函数的表达式,是直接写在了buyFoods()函数的括号里面的; > 一开始我找了好久没有找到callback()的表达式,后来又看了一眼命令行,发现就在buyFoods()函数括号里面,只是没有命名成callback()而已。 * 执行45行,执行cooking()函数,找到定义cooking()的代码,第20行。 * 执行21行。 * 执行24行,又是异步函数setTimeout(),跳过它,但之后没有语句了,等它生效; * 执行25行。 * 执行26行。 * 执行28行,赋值feast = ['鸡蛋西红柿','红烧肉','红烧鱼']; * 执行有了feast参数的29行callback(feast)函数,找到callback()的表达式,又是直接被写在了cooking()函数里面。 * 执行46行。 ```console.log('---酒席准备好了----');``` * 执行47,48行代码,是一个for循环语句,批量打印出feast里面的内容,就是feast = ['鸡蛋西红柿','红烧肉','红烧鱼']。 然后就结束了。 ^^蛮辛苦,好难。 但是很兴奋,执行得蛮顺利,克服了2个困难……给老师比心~ ^^ ================================================ FILE: homework/lesson5/wengguihua.md ================================================ ## 变量差异 第1行变量:作为函数的形参,作用域仅限于函数内部,是局部变量,引用该函数时变量名可以与定义的不一致。 第5行变量:声明了一个变量,并定义了一个变量,同时将Hello,JS这组字符串赋值给变量,这是一个字符串变量,该变量为全局变量。 第6行变量:该变量为第5行所定义的变量作为实参传递给函数。 ## 观察代码 重点对厨房工作流的代码进行思考,主要结论为:执行工作流函数后,第一步准备函数开始执行,然后通过条件语句判断是否准备完成,完成后买菜函数开始执行,完成后将结果通过callback函数A传递给做菜函数,同时通过该callback函数A启动执行做菜函数,做菜函执行数完成后将结果通过callback函数B,该callback函数B完成上菜程序。整个工作流为大家开始做准备工作,然后主管安排人买菜,买好菜后通过物流渠道把菜交给做菜的,做菜做好后通过上菜渠道把菜交给上菜的。主管交代完后大家就买菜的就开始干活了,主管也去洗澡了。 ================================================ FILE: homework/lesson5/wenliuxin.md ================================================ # 5thHomeworkd 第一行的name是参数,可以把这个name看成收纳盒的盒子,它要装的材料是name这样一个东西(就是性质为name的东西)。 第五行的name是一个参数,它等于Hello,JS,这个name就是一个材料。 第六行的name是输入函数output的数据,也就是材料,这个材料就是第五行的‘name = hello,js’,它虽然和第一行的name位置一样,但是,其实第一行是盒子,也这一行是材料,也可以说是盒子里有了材料。 ================================================ FILE: homework/lesson5/wenyunxin.md ================================================ ## 三个name变量的差异 ### 第一行的name变量 这里的name变量处于函数名后面括号里的位置,是属于这个函数的参数,也是这个函数的参数占位符。它表明这个函数至少需要传入一个参数才能正确被调用。这个name变量在这个函数里未被声明定义或赋值,表明他可以是函数允许传入的任何数据类型。 ### 第五行的name变量 这里的name变量是一个全局变量名。它被声明定义并被赋值了'Hello JS'。它在全局的任何位置可以被直接拿来使用。 ### 第六行的name变量 这里name变量是指调用函数ouput执行时传入的具体参数对象变量名称。它实际上就等价于'Hello JS'。实际上就是调用函数执行:output('Hello JS')。 ================================================ FILE: homework/lesson5/wufan.md ================================================ 终端输入: git checkout master 出现: $ git checkout master homework/.DS_Store: needs merge error: you need to resolve your current index first #lesson5代码分析 >// 模拟异步处理的手法 // 定义函数callback function callback() { console.log('我跑完了'); } // 定义函数run,run接收一个函数类型的参数,当执行完动作后,调用该函数。 function run(cb) { console.log('🏃🏃🏃🏃🏃'); cb(); } // 调用函数run,并把函数callback当参数传过去 run(callback); // 定义一个函数,函数名为callback function callback () { console.log('我终于被调用了'); } // 5秒钟后调用callback函数 setTimeout(callback, 5000); > 直接返回结果 function checkFlightSchedule() { console.log('开始查航班信息'); // 模拟构建航班的时间信息 var scheduleInfo = { ​ start: '8/23 8:00', ​ end: '8/23 10:30', ​ from: 'beijing', ​ to: 'hangzhou' }; return scheduleInfo.start; } //--------------------------------------- // 调用立即函数checkFlightSchedule var startTime = checkFlightSchedule(); console.log(startTime); > 间接回调处理 // checkFlightSchedule函数的定义者设计了一个通过回调的方案。 // 当函数处理完后,通过调用者设置过来的回调 function checkFlightSchedule(callback) { console.log('开始查航班信息'); // 模拟构建航班的时间信息 var scheduleInfo = { ​ start: '8/23 8:00', ​ end: '8/23 10:30', ​ from: 'beijing', ​ to: 'hangzhou' }; callback(scheduleInfo.start); } //--------------------------------------- function callback(startTime) {//形参,不具有实际意义。 console.log(startTime); } // 调用函数checkFlightSchedule,并塞一个回调函数以获取结果 checkFlightSchedule(callback); > 模拟一个异步函数 function checkFlightSchedule(callback) { console.log('开始查航班信息'); setTimeout(function() { ​ // 模拟构建航班的时间信息 ​ var scheduleInfo = { ​ start: '8/23 8:00', ​ end: '8/23 10:30', ​ from: 'beijing', ​ to: 'hangzhou' ​ }; ​ callback(scheduleInfo.start); }, 5000);//构建一个setTimeout函数需要内部参数为一个函数和时间 } //--------------------------------------- function callback(startTime) { console.log('通过反馈通道获得了信息'); console.log(startTime); } // 执行查询函数 checkFlightSchedule(callback); > 匿名函数的用法 function run(back){ ​ console.log('跑完用时'); ​ setTimeout(function(){var totaltime='10mins'; ​ back(totaltime);},1000) } function back(totaltime){ ​ console.log(totaltime); } run(function(){var totaltime='10mins'; ​ back(totaltime);})//这就是一个匿名函数 > 回调异步的用法 // 采购食物的函数 function buyFoods(callback) { console.log('我要开始采购食物啦。。。。'); // 模拟5秒后通过callback返回结果 setTimeout(function() { ​ console.log('采购完毕'); ​ var foodsList = ['fish', 'egg', 'meat']; ​ callback(foodsList); }, 5000); } function callback(foodsList){ console.log(foodsList); } // 做准备工作的函数 function prepare() { console.log('努力磨刀...努力洗碗...努力打扫...劳动最光荣'); return true; } // 做菜的函数 function cooking(foodsList, callback) { console.log('开始做菜啦~~~'); // 模拟5秒后通过callback返回结果 setTimeout(function() { ​ console.log('今天要做这些菜' + foodsList); ​ console.log('大工告成,上菜'); ​ var feast = ['鸡蛋西红柿', '红烧肉', '红烧鱼']; ​ callback(feast); }, 5000); } //------------------------------------------------ // 流程控制函数 function startWork() { var success = prepare(); if (!success) { ​ console.log('还没准备好'); ​ return; } buyFoods(function (foodsList) { ​ cooking(foodsList, function (feast) { ​ console.log('----酒席准备好了----'); ​ for (var i = 0; i < feast.length; i++) { ​ console.log(feast[i]); ​ } ​ }); }); console.log('事情安排好了,我先去洗个澡'); } // 干活啦~~ startWork(); # 代码分析 > 1. function output(name) { > 2. console.log(name); > 3. } > > 4. var name = 'Hello,JS'; > 5. output(name); 1//name在这里是函数function的参数名,这个参数名是用于接收别人调用时给的参数。按照先声明,定义,赋值的顺序。这里声明一个参数通道,定义它的名字叫name.这个通道可以有各种名命,就像快递的包裹的内容多种多样,书,风扇,手机,接口转换器,等等,最终它们都被快递到目的地。 2//这里的name是输出这个参数通道里的数据。 4//重新定义了一个变量名,这里可以是任意的名称,比如input,name1,等等合法的变量名。就像是快递包裹上名字可以多中多样一样。 5//输出上面定义的那个变量名所带代表的变量数据。快递终于送到目的地。 # 阅读代码的收获 间接返回代码例子: >function callback () { > > console.log('我终于被调用了'); > >} > >// 5秒钟后调用callback函数 > >setTimeout(callback, 5000)//内置库调用setTimeout()函数,此函数有两个参数,第一个是一个函数返回值的参数,第二个后置时间的参数。 > function callback(){ > > console.log('我跑完了'); > > } > > //定义函数run,run接收一个函数类型的参数,当执行完动作后,调用该函数. > > function run(e){ > > console.log('🏃🏃🏃🏃') > > e(); > > } > > run(callback); 直接返回的例子: > function checkFlightSchedule() { > > console.log('开始查航班信息'); > > // 模拟构建航班的时间信息 > > var scheduleInfo = { > > start: '8/23 8:00', > > end: '8/23 10:30', > > from: 'beijing', > > to: 'hangzhou' > > }; > > return scheduleInfo.start; > > }//---------------------------------------// 调用立即函数checkFlightSchedule > > var startTime = checkFlightSchedule(); > > console.log(startTime); ================================================ FILE: homework/lesson5/wukuipin.md ================================================ ### 第五课作业 代码分析: ``` function output(name) { console.log(name); } var name = 'Hello, JS'; output(name); ``` 第一行、第五行、第六行都有变量name。第五行的name是新申明定义的变量(这是一个全局变量),并给它赋值一个字符串‘Hello, JS’;那么,定义一个变量就得使用才行,不然就是垃圾代码,所以第六行代码就来调用第五行定义的变量(name)。同时,第六行也在调用第1~第3行定义的output函数,而output函数内部也有一个变量,恰好名字也是name(也就是第1行的name,这是一个局部变量),真是好巧啊!真所谓无巧不成书嘛!当然,它要是叫什么阿猫阿狗也行的,可偏偏他老爹也喜欢name这个名字,我们现在知道他也叫name,不过要清楚一点,这里的name和第5行的name是两个不同的变量,只是他们恰好叫同样的名字(name)而已。 第6行在调用函数和变量时,name变量的值会赋值给第1行的变量name,函数再把得到的值打印出来。最后结果会得到:Hello, JS 如下图: ![](https://ws4.sinaimg.cn/large/006tNc79gy1fiw94a35aoj30pd0770sx.jpg) ================================================ FILE: homework/lesson5/xianengqi.md ================================================ ## 【作业内容】 ###第1行、第5行、第6行的name变量都有什么差异? ``` function output(name) { console.log(name); } var name = 'xiaohua'; output(name); > 第一行的'name'可以是一个任意名,它是'形参'。第二行的'name'是把函数output(name)传递给了console.log.第二行的name要与第一行的name保持一致。 > 第五行的'name'可以是一个任意名,声明了一个变量 'name'。 把'xiaohua'这个字符串赋值给了'name' 是'实参' > 第六行的'name'是被函数output调用了第五行的name,它和第五行一样都是'实参'。 ================================================ FILE: homework/lesson5/xiongliyu.md ================================================ # 第五节课作业 ## 分析名字的不同之处 function output(name){ console.log(name); } var name = 'hello,js'; output(name); >5:被首先执行。把‘’hello,js‘’赋值给了name。 6:这一行的name调用了第五行的name(因为第五行的name是全局变量),作为实参,要传入函数名为output的函数中。 第一行的那么是函数output的形参,也是接收器,用于接受实参数据的东西。实参传入后取代形参, name从未被改变。 ### kitchen_workflow_async.js 分析(学习)代码的方法: 我是这样做的: 1. 对着敲代码(读代码),了解每段代码都是干嘛的 2. 找清楚“对象”(比如谁是采购者,谁是厨师、谁是通道) 3. 设置断点调试代码(可以根据我的想法修修改改),通过观察代码的执行顺序(理解整个流程和对象之间的关系) 4. 找关键点,比如callback,结合语法去分析(差语法) 5. 还是搞不懂就画画关系图和时序图 >个人理解: >1、所有参于调用的函数都必须 除了接受实参以外,还接受一个callback函数(通道)。 > 2、函数中两个setTimeout都是把函数处理过程延迟,其模拟的手段是:延迟5秒再返回结果。 > 3、所有被延迟返回的callback(XX);其中,callback:代表返回通道(微信)。(XX)代表需要被返回的结果。 > 4、函数调用表达式中,以一个函数作为实参,传入后实参并不参与计算,作用:只是告知一个通道,当函数计算完后,callback的返回通道就是当时以实参身份进入的函数。 ### flight_schedule_1.js ![笔记在图片里](http://wx1.sinaimg.cn/mw690/be5aedd1gy1fjtdsbixi0j20j60hhwfr.jpg) ### flight_schedule_2.js ![笔记在图片里](http://wx4.sinaimg.cn/mw690/be5aedd1gy1fjtdsc5c6sj20xc0h8tan.jpg) ### flight_schedule_3.js ![笔记在图片里](http://wx2.sinaimg.cn/mw690/be5aedd1gy1fjtdscoi07j20pi0e5ab5.jpg) ### indirect.js ![笔记在图片里](http://wx3.sinaimg.cn/mw690/be5aedd1gy1fjtdsaksd7j20r80hlabg.jpg) ================================================ FILE: homework/lesson5/yammy.md ================================================ ## 分析代码 ```sample.js function output(name){ console.log(name); } var name = "Hello,JS"; output(name); ``` 上面的代码,其中: 第1行的 name 是 定义output()这个 function 的参数。 第5行的 name 是 一个独立的变量,赋其值为一个字符串"Hello,JS"。 第6行的 name 是 把第6行的变量 name 作为 output()这个函数的参数,并执行函数。 ## 观察代码 1. array ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-23-020022.jpg) 从上图的执行结果可以看出来,第一行是打印出了一个数组,然后是遍历数组并逐个打印,其次是对数组内的元素进行增加或减少,最后是打印出某个元素在数组内的位置索引。 查看了一下 api,发现array 还支持从数组的前面加入元素,比如 `myLikeColorsList.unshift("yellow");` 2. boolean ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-23-020703.jpg) 从上图可以看出,结果是打印出了 boolean 变量转化成 string 的值。 可以推断,js 的 boolean 类型 变量在申明后,允许改变其绑定的数据类型 boolean 成 string,是一种动态语言。 3. number ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-23-022247.jpg) 从上图可以看出,第一行打印出了 number 类型的变量值,第二行打印出了 number 变量转化成 string 类型后的变量值。 4. object ![](http://okr0iw9h2.bkt.clouddn.com/2017-08-23-022859.jpg) 从上图可以看出,数据类型为对象的变量支持修改、增加和删除对象内变量,同时还支持函数变量。 ## kitchen_flow 代码越看越有意思 kitchen_workflow_async.js 这里增加了回调函数,起初看不太懂,只感觉函数中套着函数,不过慢慢的发现只要把 callback 分出来,理清楚,就很容易看懂了,真心觉得老师您教的好,以前看不懂的 js代码,现在来看简直容易多了。 ```kitchen_workflow_async.js // 采购食物的函数 function buyFoods(callback) { console.log('我要开始采购食物啦。。。。'); // 模拟5秒后通过callback返回结果 setTimeout(function() { console.log('采购完毕'); var foodsList = ['fish', 'egg', 'meat']; callback(foodsList); }, 5000); } // 做准备工作的函数 function prepare() { console.log('努力磨刀...努力洗碗...努力打扫...劳动最光荣'); return true; } // 做菜的函数 function cooking(foodsList, callback) { console.log('开始做菜啦~~~'); // 模拟5秒后通过callback返回结果 setTimeout(function() { console.log('今天要做这些菜' + foodsList); console.log('大工告成,上菜'); var feast = ['鸡蛋西红柿', '红烧肉', '红烧鱼']; }, 5000); } //------------------------------------------------ // 流程控制函数 function startWork() { var success = prepare(); if (!success) { console.log('还没准备好'); return; } buyFoods(function (foodsList) { cooking(foodsList, function (feast) { console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } }); }); console.log('事情安排好了,我先去洗个澡'); } // 干活啦~~ startWork(); ``` 看这一段代码的时候,我注意到 cooking 函数中少调用了 callback。 另外感觉安排事情的人和具体按流程做事情的人分开来,可能更容易理解。 ================================================ FILE: homework/lesson5/yangchunguang.md ================================================ #第五节课:分析代码 ##1.indirect_call.js ``` 间接返回,是指第一段先定义出结果“我跑完了”,但是不打印输出。接着再运行“🏃🏃🏃🏃🏃”的代码,最后把定义的结果“我跑完了”通过run回传给“cb”(其实可以是ab,sb等任何字母,只不过为了便于理解和维护,和callback对应,才写了cb),回传之后console.log('🏃🏃🏃🏃🏃'),然后再通过cb(),输出“我跑完了”。 之所以是最简单的返回,就是通过定义callback,然后通过run把callback回传给cb,而不是直接输出结果,所以是间接返回。 ``` ##2.async_function.js // 最简单模拟异步的技巧 这里其实不是异步,只是时间延迟5秒。异步是并不立即返回结果,而是过了一小段时间后才出结果。 ##3.flight_schedule_1.js // 立即返回案例 立即返回:就是发出指令后立即执行,并返回结果。 代码中,先发出查询航班信息指令,接着构建查询航班模型,然后return结果,到最后console.log(heckFlightSchedule);输出结果,中间并没有停滞,所以是立即返回。 ##4.flight_schedule_2.js // 间接返回案例 间接返回:就是在直接返回的基础上,增加间接传输渠道。 本案例中,先把航班信息给callback,再通过checkFlightSchedule(callback)回传给callback(scheduleInfo.start);,最后通过console.log(startTime);输出。 ##5.flight_schedule_3.js // 异步处理案例 异步:就是发出指令后,该干嘛干嘛,然后由后台执行,执行出结果后,再返回结果。 本案例没有看太明白,看到有5s的延迟, ##6.kitchen_wordflow_async.js // 异步实现一桌酒席 先定义function buyFoods、function prepare、function cooking三个步骤,然后通过流程控制实现做菜的流程,并在流程中增加判断功能,如果某一步骤没有准备好,则return(‘还没准备好’)。过程就是定义函数,确定流程,然后执行。 ##代码分析: ![](C:\Users\ycg\Desktop\代码分析.jpg) 第一行和第二行代码为同一个name,第五行和第六行是同一个name,上下两个name可以不一样,但是上下有哪些关系就不清楚了。 ================================================ FILE: homework/lesson5/yangtieming.md ================================================ ##第1行、第5行、第6行的name变量都有什么差异? > 1. function output (name) { > 2.     console.log(name); > 3. } > 4. > 5. var name = 'Hello,JS'; > 6. output(name); 1. 第一行的name,是函数output的参数名称,它可以是任意值。 2. 第五行的name, 是一个被定义的变量,它被赋值成一个叫做'Hello,JS'的字符串。 3. 第六行的name, 也是函数output的参数名称,但此时它已不是任意值,只能是被赋值后的'Hello,JS'这个字符串。 ================================================ FILE: homework/lesson5/yangxuewu.md ================================================ ## 1. 示例代码分析 **作业示例代码:** ```javascript function output(name){ console.log(name); } var name = 'Hello,JS'; output(name); ``` **分析:** 示例代码中有四个 name ,但四个 name 的含义却是不一样的。 第 1 行的 name ,是函数 `output()` 的参数,表示在调用 `output()` 函数时,需要给这个函数传入一个参数。 第 2 行的 name 就是函数 `output()` 的参数,所以,第 2 行的 name 和第 1 行的 name 是一样的。 第 5 行的 name 是一个变量,它的值是 `Hello,JS` ,这行代码的意思很明显,定义一个变量 name ,并给它赋值。 第 6 行的 name 就是第 5 行定义的变量,因此第 6 行的 name 就是 `Hello,JS` 。 **结论:** 示例代码中,第 1 行的 name 表示函数的参数,在调用前没有具体的值,第 5 、 6 行的name 表示变量,并对这个变量赋予了值。 ## 2. 函数回调 老师说这部分是 JS 中最难理解的,我觉得因为突然把一个函数的参数变成了另一个函数,所以理解起来比较难。也就是说在 JS 里,函数的参数不仅可以是各种数据类型,也可以是函数,理解起来自然有点绕,那就用例子来分析。代码示例来自课程项目 `/getting-started-with-javascript/study/lesson5/kitchen_workflow_async.js` ```javascript // 采购食物的函数 function buyFoods(callback) { console.log('我要开始采购食物啦。。。。'); // 模拟5秒后通过callback返回结果 setTimeout(function() { console.log('采购完毕'); var foodsList = ['fish', 'egg', 'meat']; callback(foodsList); }, 5000); } // 做准备工作的函数 function prepare() { console.log('努力磨刀...努力洗碗...努力打扫...劳动最光荣'); return true; } // 做菜的函数 function cooking(foodsList, callback) { console.log('开始做菜啦~~~'); // 模拟5秒后通过callback返回结果 setTimeout(function() { console.log('今天要做这些菜' + foodsList); console.log('大工告成,上菜'); var feast = ['鸡蛋西红柿', '红烧肉', '红烧鱼']; callback(feast); }, 5000); } //------------------------------------------------ // 流程控制函数 function startWork() { var success = prepare(); if (!success) { console.log('还没准备好'); return; } buyFoods(function (foodsList) { cooking(foodsList, function (feast) { console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } }); }); console.log('事情安排好了,我先去洗个澡'); } // 干活啦~~ startWork(); ``` 在这个示例代码中,我认为通过从结果到过程的反向阅读代码的方式,能更好理解回调函数在这个示例中的作用。反向阅读中最重要的一段代码就是 `startWork()` 函数,我把我的分析写成注释,加入这个函数。 ```javascript // 流程控制函数 function startWork() { var success = prepare();//调用 prepare() 函数,将函数的返回值 true 赋值给 success if (!success) {//如果 success 没有得到 true 赋值,则执行 if 语句 console.log('还没准备好'); return;//因为 success 值非 true,因此函数终止执行 } /* *1. 函数 buyFoods(callback) 有一个 callback 函数,在这里就是 function (foodsList){} * 因此,在 JS 里,函数不必一定要写成 function functionName(parameters){} 的形式 * 还可以写成 function (parameters){} 的形式,在函数中立即调用 *2. function (foodsList){} 接收一个 foodsList 参数,并将其传递给 cooking(foodsList,callback){} * 在这里,callback 函数就是 function (feast){} *3. JS 的回调函数很容易让人绕在里面, * 一方面回调函数是函数,它被调用了就是要执行的, * 另一方面回调函数应该看作调用函数的参数, * 既然是参数,回调函数的执行时机应根据调用函数要求执行 */ buyFoods(function (foodsList) { cooking(foodsList, function (feast) { console.log('----酒席准备好了----'); for (var i = 0; i < feast.length; i++) { console.log(feast[i]); } }); }); console.log('事情安排好了,我先去洗个澡'); } ``` ================================================ FILE: homework/lesson5/yanqingmu.md ================================================ # Homework for Lesson 5 ## 1.阅读并执行代码 (1)async_fuction.js中```setTime(callback,5000);```是一个内置函数,其中参数```callback```是一个函数名,`5000`表示延迟的时间。这个内置函数的参数形式是已经定义好的,所以`setTime(callback(),5000);`就是不对的。同时,在flight_schedule_3.js中,我们发现可以在setTimeout中直接定义一个函数作为第一个参数,而且不需要函数名。 (2)对于内置函数`console.log()`而言,`()`中是要打印的内容,可以是变量、函数以及具体的值,那么`console.log(startTime);`也可以写成`console.log(checkFlightSchedule());`。 (3)indirect_call.js让我意识到间接调用的强大之处,它可以实现一个功能的整合和拆分。也就是说可以用一个函数来整合其他函数,从而实现更加强大的功能,比如把原来的代码改为如下的形式: ```// 定义函数callback function teacher() { console.log('冲刺'); } function student() { console.log('Yes, sir!'); } function run(person1,person2) { console.log('🏃🏃🏃🏃🏃'); person1(); person2(); } run(teacher, student); ``` (4)关于kitchen_workflow_async.js有几处没有搞懂。 * 流程控制函数中,先声明了一个success,然后判断`prepare()`是否准备好(其中的if语句,只有当prepare函数的return为false或0的时候,才能被执行,这里只是表达逻辑的完整)。但是并没有调用`prepare()`的语句,但是最后准备函数还是被执行了。所以,我的问题是:为什么声明语句`var success = prepare();`起到了调用函数的作用? * 流程控制函数中,buyFoods的调用又嵌套了一个cooking调用和两个function定义,这样写的好处是什么?其中foodList是函数buyFoods中的局部变量,为什么可以用在cooking函数中,是否跟这种buyFoods的调用形式有关,`function(foodList){…}`替代了原来的callback使得cooking函数可以使用变量foodList? * 流程控制函数中,`cnsole.log('事情安排好了,我先去洗个澡');`这条打印明明是最后一条语句,却出现在「采购完毕」的前面,这是否跟延迟5s有关呢? ## 2.一起来找茬 需要找茬的代码是这样的: ``` function output(name){ console.log(name); } var name = 'Hello,JS'; output(name); ``` 这里一共有4个```name```,它们看起来一个样,但含义却不一样。 (1)我们先来看前两个。 这两个```name```是在一个```function```里的,其中```function```所表达的含义是:你要先给我一个变量作为参数我才运行,运行的结果是把这个变量的值打印出来。 所以前两个```name```是统一的,但这里的```name```只是针对这个```function```所需参数的命名,并不一定需要与5、6行的```name```一致。也就是说代码可以改写成这样: ``` function output(lover){ console.log(lover); } var name = 'Hello,JS'; output(name); ``` (2)我们再来看看5、6行的```name```。 第5行中定义了一个string变量,命名为```name```,同时赋值```'Hello,JS'```。第6行是将第5行中定义的name变量作为参数提供给函数output,并执行函数output。所以第5、6行的name是统一的。这里可以把源代码改为如下形式: ``` function output(name){ console.log(name); } var girlFriend = 'Hello,JS'; output(girlFriend); ``` ================================================ FILE: homework/lesson5/yimiao li 5th.md ================================================ Lesson 5 **最重要的概念就是函数, 立即返回函数, 间接返回函数** ## 函数三要素 假如你要请一个人帮忙做某事,你必须要明确到底请谁(函数名)?告诉他你的要求(参数)是什么,他处理完事情后就会给你一个结果。 functon 函数名(参数) >参数作用可以一句话总结:在函数执行过程中,完成某些逻辑处理时需要的一些必要的数据。 ## 错误记录一(print 函数) function print(content) { console.log('hello, JS'); } print(content);// 是一个错误的结果,因为没有定义content,print后面是一个变量形式,数字、string等,需要加: 'content' ## 错误记录二(关于return 函数) 这是 node 和 浏览器环境的区别。**return函数在浏览器条件下,直接可以执行;但是在node环境下没法执行,必须要console.log才可以** 在使用 return 语句时,函数会停止执行,并返回指定的值。 ## 异步函数 setTimeout 是内置函数所以不用定义就可以直接用。 ## 变量和函数定义的区别: > 变量和函数定义的区别: > **变量:**先定义后使用 > **函数:**无论在哪定义,使用的时候才调用 ## 作业部分 function output(name) { //name形参 是一个空壳子 console.log(name); //打印参数name的具体内容 } var name = 'Hello,JS'; //定义变量name 也是是定义实参 output(name) //调用name这个函数,这是真正赋值的内容 ================================================ FILE: homework/lesson5/youshilei.md ================================================ #第五课作业 ##作业题目 1. 阅读study/lesson5的sample代码,并执行观察结果。 2. 图片上的代码,第1行、第5行、第6行的name变量都有什么差异?请分析差异提交你的结论。以你命名的md文件提交。 ##我的解答 ```javascript function output(name){ console.log(name); } var name = 'Hello,JS'; output(name); ``` - 第1行name是自定义函数output用来传递的参数,通过它可以函数外部数值传递给函数内部,也就是第2行里的name。 - 第5行name是新声明的变量,并且给它赋值。 - 第6行name是自定义函数用于计算的变量,它调用的外部第5行name变量的值。 ================================================ FILE: homework/lesson5/zhanggaoyang.md ================================================ 第五课作业 outpu是一个函数名 function output(name) { console.log(name); } var name = 'Hello,js'; output(name); output是一个函数变量,var定义了一个值`'Hello,js'`而这个值被传入到`function`函数里,所以`function`是一个按值传递,即虽然参数不同但不影响结果。 所以,函数的`name`和var定义的`name`是不同的。 ================================================ FILE: homework/lesson5/zhanglina.md ================================================ --- 2017-08-28 第5次作业补交 —-create by zhanglina --- 1. ##### 作业回答: ```javascript 1. function output(name) { 2. console.log(name); 3. } 4. var name = 'Hello,JS'; 5. output(name); ``` ```sql 第1行的name:声明一个output的函数,该函数有一个为name的形参 第4行的name:定义了一个叫name的变量,并给其进行赋值操作,或者叫做初始化的操作 第5行的name:将第4行初始化name,传给函数进行调用 ``` ​ 2. ##### 课程理解: ``` 函数的三要素:参数判断,逻辑处理,返回结果 参数判断:主要进行了函数有效性的判断,如果传入的值符合程序的规则,才会执行后续程序,保证了代码的完整性。 逻辑处理:是程序的核心的,该部分是通过程序语言,将PM的需求通过代码的方式实现 返回结果:程序处理完成之后,给出一个执行结束的标致。 ``` ​ 3. ##### 代码改写: ```javascript function checkFlightSchedule() { console.log('开始查航班信息'); // 模拟构建航班的时间信息 var scheduleInfo = { start: '8/23 8:00', end: '8/23 10:30', from: 'beijing', to: 'hangzhou' }; return scheduleInfo.start + " "+ scheduleInfo.end + " " + scheduleInfo.from + " " + scheduleInfo.to; } //--------------------------------------- // 调用立即函数checkFlightSchedule var infomation = checkFlightSchedule(); console.log(infomation); =====================差点没有看懂老师的代码======================= // 定义函数callback——修改前 function callback() { console.log('我跑完了'); } // 定义函数run,run接收一个函数类型的参数,当执行完动作后,调用该函数。 function run(cb) { console.log('🏃🏃🏃🏃🏃'); cb(); } // 调用函数run,并把函数callback当参数传过去 run(callback); // 定义函数callback——修改后 function callback() { console.log('我跑完了'); } // 定义函数run,run接收一个函数类型的参数,当执行完动作后,调用该函数。 function run(cb) { console.log('🏃🏃🏃🏃🏃'); callback(); } // 调用函数run,并把函数callback当参数传过去 run(1); 代码都执行一遍,还有一个kitchen_workflow_async.js没有看懂呢,回去继续看 ``` ​ 4. ##### 难点总结: ```JavaScript 1、关于异步的定义:(百度) 在计算机领域,同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。 2、个人理解:(结合老师的讲解) 老师以老板和秘书之间的交互举例:间接返回、异步处理方式,老师和秘书,都可以各做各的事情,而不是老板傻傻地在线等。待秘书查好航班信息后,可将结果反馈给老板。 3、代码的实现: 由于第一次接触函数传参时,传入的参数同样是一个函数的情况,开始老师讲的这样方式,第一:表示奇怪,第二:理解起来有点弯。直到老师讲到一句话,间接返回,就是定义函数时,不让其直接返回,让其按照某种指定的规则和通道返回,忽然有种打通了任督二脉的感觉。通过课上理解和结合代码的实现,渐渐找到了些为什么要定义间接返回的方式和异步这种的场景的理解。不过我觉得要更深层次的理解,仍需要在实际编程,应用的时候,返回再次来思考,或许能够理解的更透彻。 回调函数,间接返回,异步,这些概念啊,第一次见到他们的时候,十分懵逼。 ``` ​ ================================================ FILE: homework/lesson5/zhaoxiaoxin.md ================================================ 1、作业 function output(name) { console.log(name); }; var name = 'Hello,JS'; output(name); 第一行在声明并定义函数output() 此name是函数output()的参数。 第五行在重新声明并定义的一个变量,此name是变量名。 第六行是在调用函数output(),此name是在第五行定义的变量,这里作为参数传给了函数。 2、问题一,什么是匿名函数? 匿名函数,是在微信群里看到的。 我的理解是,匿名,就是没有名字的函数。根据老师的指导,在给出的文件里找到的匿名函数如下 setTimeout(function(){ } ) 这个函数里的function()就是匿名函数。是个函数,但没有取名字。 作用是,参与构建其他的函数,但是很简单,没有名字,只取用它的函数功能。 3、问题二,我们为什么要选择回调函数? 在敲完老师给的几个案例后,关于回调函数怎么使用,已经基本明白了。 但关于为什么使用,还有点不清楚。 学习了报数后,感觉第一种形式里,直接全部调用全部函数,这种方式简单直接。 在学习回调函数的时候,内心一直有个疑问? 为什么要用回调函数呢?为什么不直接返回数值呢?是不是多此一举呢? 老师举了很多例子,证明现实生活中确实有这种情况存在。 比如网购,必须等买家发货邮寄后,才能收到货物。这一点,我可以理解。 还有没有其他的解释呢? 在flight_schedule的三个例子中, 只从编码的角度看,我还是觉得直接输出参数更简便直接,使用callback函数,还是多了一步,有点多此一举的感觉。 关于为什么要多这一步,使用回调函数还有没有其他好处呢? 目前还有一点不清楚。 ================================================ FILE: homework/lesson5/zhaoyinan.md ================================================ ##关于JS学习最困难的部分## 1.补作业: 在上课时听老师说这部分就是JS最难的一部分,心想如果这就是最难的部分,为何不尝试着去攻克它?让自己JS能有更深入的学习?于是就暗下决心开始了自己的补作业之路。 2.写作业: 在开始劫笔写之前,看了何伟和云飞的作业,都写的非常不错且细致,很是佩服他们认真学习的态度和钻研精神,看来还需要不断努力才是啊。自己一向写文章没有什么基础,没有什么逻辑和思路可言,只能试着不断写,看看能不能接近这些优秀的同学。 3.正式写作业: 代码,第1行、第5行、第6行的name变量都有什么差异? ``` 1. function output(name) { 2. console.log(name); 3. } 4. var name = 'Hello,JS'; 5. output(name); ``` 这里有必要先提一下关于“形参”和“实参”这两个概念: 形参——只是作为表示符号,其作用范围仅仅在函数表达式之内,并且由于在函数表达式内并未对其进行赋值,因此它并不具有实际意义或实际值,而只能当作是一个传递变量值的载体或工具。代码中的第1行中的name就属于形参。 实参——由于经过了变量赋值,函数变量值代入等2个步骤,第5、6行中的name就具有的实际的参数,因此称为实参。 ================================================ FILE: homework/lesson5/zhouqizhou.md ================================================ # 第五课作业 ## 第一个name 函数里面的参数,也称形参,主要跟函数内部的中的变量名相对应 ## 第二个name 是整体函数定义之后再文件中使用 ## 第三个name 获取第二name的值,并传递给函数使用 ================================================ FILE: homework/lesson5/zhuningning.md ================================================ ```function output(name) { console.log(name); } var name = 'Hello,JS'; output(name); ``` * 第1行、name 为函数output的参数属于局部没有赋值的变量。 * 第5行、name 为声明字符串变量,并赋值'Hello, JS' * 第6行,name 为第5行定义的 name 字符串变量,在调用output函数时,被当做参数传进去。 ================================================ FILE: homework/lesson5/zhutinglesson5.md ================================================ function output(name){ console.log(name); } var name = 'Hello.js'; output(name); 第一行: name是函数output的入参,此处只是一个名称,需要调用函数时传入。比如第6行的调用传入的就是Hello.js 第二行:与第一行一样,打印函数入参,调用函数时传入 第五行:name是个变量,并且赋值为 Hello.js 第六行:同第五行,传入变量名,可以理解为一个代号 ================================================ FILE: homework/lesson5/zhuyongjin.md ================================================ 下面代码中,第1行、第4行、第5行的name变量都有什么差异? ``` 1. function output(name) { 2. console.log(name); 3. } 4. var name = 'Hello,JS'; 5. output(name); ``` 【回答】 针对上面的整个,我是这么理解的。就像是一道数学题。 第一行:建立一个函数 F(x) 第二行;输出这个函数 =x 第五行:告知X的具体值,这里面叫赋值 x=Hello,JS 第六行:输出整个函数f(x)具体值,也就是 Hello,JS 在我看来,第一行Name, 是函数未知变量,可以是某个值,也可以是运行后的值 第四行Name, 是赋值,赋值给第一行Name 的一个具体值 第五行Name, 是输出值,相当于问 F(x)的结果 ================================================ FILE: homework/lesson5/谢玉辉.md ================================================ function output(name){ //使用function定义一个函数,函数名叫output,括号里的name为参数。 console.log(name); } var name = 'hello,js'; //定义一个名为'name'的字符串变量,并赋值'hello,js' output(name); //调用'function output(name)'函数并把'name'变量的值 (也就是'hello,js') 作为参数传到这个函数的肚子里面去。 ================================================ FILE: homework/lesson6/GaoXianfeng.js ================================================ var fs = require('fs'); var filePath = '../words'; // 该脚本文件在 script 目录下 var outputPath = 'out_put_async.txt'; fs.readdir(filePath, function(err, files) { if (err) { console.log('获取文件失败'); return; } if (files.length <= 0) { console.log('没有找到任何文件'); } else { console.log('开始写入'); fs.writeFile(outputPath, files, function(err) { if (err) { console.log('写入文件失败'); } else { console.log('写入文件成功'); } }); } }); ================================================ FILE: homework/lesson6/LiuShengsi.js ================================================ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。 var dirPathString = '../../homework/lesson1'; // 定义要写入的文件路径 var outputPathString = './files_name_disposed_by_liushengsi.txt'; // 定义一个read_file_result函数,用于接收读取文件夹内容后的结果 function read_file_result(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { console.log(files); //调用fs的writeFile函数将读取的内容写进目标文件 var fileContent = files fs.writeFile(outputPathString, fileContent, write_file_result); } else { console.log('没有找到任何文件'); } } // 定义一个write_file_result函数,用于接收写文件的返回结果 function write_file_result(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } //调用fs的readdir函数来读文件夹下的所有文件 fs.readdir(dirPathString, read_file_result); ================================================ FILE: homework/lesson6/Risexie.js ================================================ // 引入fs模块 var fs = require('fs'); //定义读取文件的路径 var dirPathString = '../../../../words-from-the-heart' //异步方案 //定义一个callback函数, function callback1(err,files){ if(err){ console.log('读取文件失败'); } if(files.length > 0) { //在使用不同的方法获取数据的时候要注意,获取数据的格式是什么 // 例如 fs.writeFile这个方法输出的内容是是一数组。 //所以在下面用了.join这个方法,(.jion)这个方法可以将数组中的所有元素放进一个字符串 //所以输出的file数组,就被.jion方法放进了fileContent。 //.jion这个方法还可以在后面给他指定元素的分隔符,这里用了“\n”。通过空行分割。 //也可以用var = fileContent = files.jion(".")。用.来进行分割 console.log(files); //把files里面的文件赋值给fileContent var fileContent = files.join("\n") //不知道应该如何把files给到fs.writeFile函数,所以在这里卡了很久 //除了把函数嵌套进来之外还有别的方法吗? fs.writeFile(FilePathString,fileContent,callback2) } else { console.log('没有找到文件'); } } //调用fs的readdir函数,并输出文档。 //在调用任何函数之前,我们一定要了解清楚函数所需要输入的的参数类型是什么 //例如在下面的函数fs.readdir(path,function(err,files)) //第一个地方是读取文件的路径,第二个是一个回调函数,里面包含错误的信心和files //也就是读取出来的数组!,一定要注意是数组,这一点非常重要。 //因为我们用写入函数的时候,fs.writeFile这个函数要读取的参数是字符串 //所以我们需要使用别的方法把数组转换成字符串,这样才能被fs.write这个函数使用 fs.readdir(dirPathString,callback1) //定义要写入的文件路径 var FilePathString = './write_file_asyne.txt'; function callback2(err){ if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } ================================================ FILE: homework/lesson6/WANG_Xuanding.js ================================================ var fs = require('fs'); var dirPathString = 'C:/Users/MSI/my_project/getting-started-with-javascript/words-from-the-heart'; var outputPathString = './quming.txt'; var outPutFileContent = fs.readdirSync(dirPathString); fs.writeFileSync(outputPathString, outPutFileContent); var fs = require('fs'); var readPathString = 'C:/Users/MSI/my_project/getting-started-with-javascript/words-from-the-heart'; var writePathString = './quming.txt'; function read_callback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { var fileContent = files fs.writeFile(writePathString, fileContent, write_callback); } else { console.log('没有找到任何文件'); } } function write_callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.readdir(readPathString, read_callback); ================================================ FILE: homework/lesson6/Wei.js ================================================ /* *第六课作业 Wei * * */ //同步方案 // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。 var dirPathString = '../../../words-from-the-heart'; //指定读取后所写入的文件的存放路径,名称和格式 var outputPathString = './Wei.txt'; //读取内容并赋值给写入文件 var outPutFileContent = fs.readdirSync(dirPathString); //调用fs的writeFileSync函数来写文件 fs.writeFileSync(outputPathString, outPutFileContent); //异步方案 var fs = require('fs'); var readPathString = '../../../words-from-the-heart'; var writePathString = './Wei.txt'; // 定义一个read_callback函数,用于接收读取文件夹内容后的结果 function read_callback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { //将读取的内容写进目标文件 var fileContent = files fs.writeFile(writePathString, fileContent, write_callback); } else { console.log('没有找到任何文件'); } } //定义一个write_callback函数,用于接收写文件的返回结果 function write_callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.readdir(readPathString, read_callback); ================================================ FILE: homework/lesson6/WuGaoxing.js ================================================ var fs = require('fs'); fs.writeFileSync((__dirname)+'/fileNameCollection.txt', fs.readdirSync(__dirname)); ================================================ FILE: homework/lesson6/anjiancai.js ================================================ //1、同步读写,但不能实现写入的全是json文件 var fs = require('fs'); var dirPathString = '../my_project3/words-from-the-heart'; var outputPathString = '../my_project2/rewrite2.txt'; fs.writeFileSync(outputPathString, fs.readdirSync(dirPathString)); //2、异步读,同步写,可实现写入的全是json文件 var fs = require('fs'); var dirPathString = '../my_project3/words-from-the-heart'; var outputPathString = '../my_project2/rewrite3.txt'; var names =[]; function readcallback(err, files) { if (err) { console.log('读取文件失败'); } for (var i = 0; i < files.length; i++) { if (files[i].endsWith('.json')) { names.push(files[i]); } } fs.writeFileSync(outputPathString, names); } fs.readdir(dirPathString, readcallback); //3、异步读写,应保证异步读在异步写前完成。 var fs = require('fs'); var dirPathString = '../my_project3/words-from-the-heart'; var filePathString = '../my_project2/rewrite.txt'; var names = []; function readcallback(err, files) { if (err) { console.log('读取文件失败'); } for (var i = 0; i < files.length; i++) { if (files[i].endsWith('.json')) { names.push(files[i]); } } fs.writeFile(filePathString, names, writecallback); } fs.readdir(dirPathString, readcallback); function writecallback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } ================================================ FILE: homework/lesson6/babysodme.js ================================================ var fs = require('fs'); var dirPathString = './'; var files = fs.readdir(dirPathString, callbackScanFiles); //定义一个接收函数,用于接收读取文件夹内容后的结果 function callbackScanFiles(err, files){ if (err){ console.log('------这个文件需要放在所查询文件内------'); console.log('oh,读取文件失败,请检查文件是否放在当前文件内'); console.log('------调整位置,在来一次--------'); } if (files != undefined){ callbackWriteFiles(files); }else{ console.log('读取的是空文件'); } }; //定义一个写文件函数,用于存储读取文件的返回结果 function callbackWriteFiles(files){ if (files != undefined){ var outputPathString = './Write_file_async.txt'; fs.writeFileSync(outputPathString,files); console.log('写文件成功') console.log('打开查询文件夹查看.txt文档'); }else{ console.log('写文件失败'); } }; //点用scanFiles函数来读写文件 console.log('正在检索中...'); callbackScanFiles(); ================================================ FILE: homework/lesson6/baoguoqiang.js ================================================ /* * 同步方案 * 扫描某个文件夹的所有内容 */ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹 var dirPathString = '../words-from-the-heart'; var files = fs.readdirSync(dirPathString); console.log(files); // 定义要写入的文件路径 var outputPathString = '../baoguoqiang.txt'; // 定义文件内容变量fileContent var fileContent = '.....'; // 调用fs的writeFileSync函数来写文件 fs.writeFileSync(outputPathString,fileContent); // 异步方案 // 引入fs模块 var fs = require('fs'); //定义要查询的目标文件夹。 var dirPathString = '../words-from-the-heart'; //定义一个callback函数,用于接受读取文件夹内容后的结果 function callback(err,files) { if (err) { console.log('读取文件失败'); } if (files.length > 0) { console.log(files); } else { console.log('没有找到任何文件'); } } // 调用fs的readdir函数读取所有文件 fs.readdir(dirPathString,callback); // 定义要写入的文件路径 var filePathString = '../baoguoqiang.txt'; // 定义文件内容变量fileContent var fileContent = '.....'; // 定义一个callback函数,用于接受写文件的返回结果 function callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } //调用fs的writeFile函数来写文件 fs.writeFile(filePathString,fileContent,callback); ================================================ FILE: homework/lesson6/caijinpeng.js ================================================ var fs=require('fs'); var dirPathString='./'; var files=fs.readdirSync(dirPathString); var outputPathString = './write_file_sync.txt'; var fileContent =files; fs.writeFileSync(outputPathString, fileContent); ================================================ FILE: homework/lesson6/caozhen.js ================================================ // 引入FileSystem var fs = require('fs'); // 定义要读取的路径 var readDirPath = '../../../words-from-the-heart/'; // 下面分别使用同步和异步两种方式读取并写入homework/lesson6文件夹 // 方案1:同步读取 同步写入 console.log('方案1-开始'); var writeFilePath1 = './fileNameOfSchema1_caozhen.txt'; if (!fs.existsSync(readDirPath)) { console.log('读取路径不存在!请检查读取路径是否正确') } else { var files1 = fs.readdirSync(readDirPath); if (files1.length == 0) { console.log('读取路径中没有找到任何文件!请检查读取路径是否正确'); } else { for (var index = 0; index < files1.length; index++) { if (!fs.statSync(readDirPath + files1[index]).isFile()) { console.log('[Warning] ' + files1[index]+ ' 不是文件,跳过'); } else if (files1[index].match('\.json$') == null ) { console.log('[Warning] ' + files1[index]+ ' 不是json,跳过') } else { fs.writeFileSync(writeFilePath1, files1[index]+'\n', {flag: 'a'}); } } console.log('方案1-写入完成!'); } } // 方案2:异步读取,异步写入 console.log('方案2-开始'); var writeFilePath2 = './fileNameOfSchema2_caozhen.txt'; function readCallback(err, files2) { if (err) { console.log('读取路径失败,请检查读取路径是否正确'); return; } else { if (files2.length == 0) { console.log('读取路径中没有找到任何文件,请检查读取路径是否正确'); } else { for (var index = 0; index < files2.length; index++) { if (!fs.statSync(readDirPath + files2[index]).isFile()) { console.log('[Warning] ' + files2[index]+ ' 不是文件,跳过'); } else if (files2[index].match('\.json$') == null ) { console.log('[Warning] ' + files2[index]+ ' 不是json,跳过') } else { fs.writeFile(writeFilePath2, files2[index]+'\n', {flag: 'a'}, writeCallback); } } console.log('方案2-写入完成'); } } } function writeCallback(err) { if (err) { console.log('写文件时出错啦'); } } fs.readdir(readDirPath, readCallback); ================================================ FILE: homework/lesson6/caozhen.md ================================================ # 提高代码兼容性&可读性的操作实践 本文是完成lesson6作业后,对作业过程的思路总结;希望能帮助到代码经验较少的小白同学们。 ## 通过模仿sample代码完成基本功能 徐老师给了我们四段sample代码,分别实现了同步/异步读取文件路径,以及同步/异步向文件写入内容。 通过模仿,我们可以完成lesson6作业的基本要求。下面分别给出两个代码示例: ### 同步读取+同步写入 ```javascript // 引入FileSystem var fs = require('fs'); // 定义要读取的路径 var readDirPath = '../../../words-from-the-heart/'; // 方案1:同步读取 同步写入 var writeFilePath = './fileNameOfSchema1_caozhen.txt'; var files = fs.readdirSync(readDirPath); fs.writeFileSync(writeFilePath, files); ``` ### 异步读取+异步写入 ```javascript // 引入FileSystem var fs = require('fs'); // 定义要读取的路径 var readDirPath = '../../../words-from-the-heart/'; // 方案2:异步读取 异步写入 var writeFilePath = './fileNameOfSchema2_caozhen.txt'; // 定义读取时的回调函数 function readCallback(err, files) { if (err) { console.log('读取路径失败'); return; } else { if (files.length > 0) { // 异步写入 fs.writeFile(writeFilePath, files, writeCallback); } else { console.log('没有找到任何文件'); } } } // 定义写入时的回调函数 function writeCallback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.readdir(readDirPath, readCallback); ``` ### 得到的结果 上面两个方案输出的txt文件内容是这样的: ![](http://opkslf6o7.bkt.clouddn.com/js-lesson6-result1.png) ### 观察结果后的思考 重点来了,我们得到的结果是老师想要的么?上图显示的结果至少有以下几个问题: - 发现输出结果中有隐藏文件,比如`.git` - 发现输出结果中有文件夹,比如`script` - 发现输出结果中有非json文件,比如`xx.json.txt` - 一大堆结果挤在一起,看着好丑 除此之外,还有哪些地方存在问题?或者说,老师的这个作业中给我们预留了多少坑等我们去踩呢? ## 分析到底有哪些地方存在问题(坑)? **思考这个问题的关键在于,把自己代入成使用者,即**:如果我现在正使用这段代码,我可能会进行哪些操作?遇到什么问题? - 可能给出了一个根本不存在的路径 - 可能给出了一个路径,但里面没有文件 - 可能给出了一个路径,里面不仅有文件,还有文件夹(而文件夹并不是我们想要的) - 可能给出了一个路径,里面存在一些不满足要求的文件(即不是.json的文件,也不是我们想要的) 以上问题(坑),都是我们在代码开发时需要关注并处理的。 即老师上课时提到的:**通过异常处理,提高代码的兼容性** 此外,针对上面提到的“一大堆结果挤在一起,看着好丑“,怎么改善呢? - 我们更希望每个文件名一行,整齐排列 即:**提高代码执行结果的可读性** ## 如何解决这些问题? ### 基本思路 - 先踩一下坑看看,会导致什么结果 - 思考解决问题的方案,以及可能需要用到的功能 - 在库中寻找这个功能对应的函数,及其定义 - 模仿&实现在我们的代码中 ### 下面举几个实操案例 #### 案例1-处理不存在路径 **先踩一下坑看看,会导致什么结果** 我们给出一个不存在路径,比如 ```javascript var readDirPath = '~/test'; //备注:该路径不存在 ``` 运行一下,出现错误 ![](http://opkslf6o7.bkt.clouddn.com/js-lesson6-err1.png) **思考解决问题的方案及可能需要用到的功能** 思考:如果我们在代码中判断一下路径是否存在,问题就解决了嘛!即老师课上提到的**参数检查**。 **在库中寻找这个功能对应的函数及其定义** 上面提到的关键功能是**判断路径是否存在**,我们去库里找一找,有没有函数可以实现这个功能? 在nodejs documentation中搜索关键词`exist`,看!找到了! ![](http://opkslf6o7.bkt.clouddn.com/js-lesson6-existsSync.png) 看一下文档描述,学习一下用法,就可以模仿着在自己的代码中实现了。 **模仿&实现在自己的代码中** ```javascript var readDirPath = '~/test/'; // 故意给一个不存在的路径 if (!fs.existsSync(readDirPath)) { console.log('读取路径不存在!请检查读取路径是否正确') } else { xxx xxx // 执行后续代码 } ``` 下面再举一例 #### 案例2-处理文件夹 **我们已经知道运行结果了,直接来思考怎么办,此步骤省略** **思考解决问题的方案及可能需要用到的功能** 思考: - 我们得到的`files`是一个object,里面有很多文件名,需要一一判断 —— **要用到循环语句for** - 判断是文件还是文件夹 —— **要去库中找找用什么方法实现** - 如果不是文件就不输出了,是文件才输出到txt —— **要用到条件语句if** - 如果文件名不是json格式,也不满足条件不输出 —— **同样要去找找怎么实现** **在库中寻找上述功能对应的函数及其定义** 我们去库里找一找,有没有函数可以实现`判断是文件还是文件夹`这个功能? 搜索关键词`isfile`试试,我们找到了以下内容! ![](http://opkslf6o7.bkt.clouddn.com/js-lesson6-isfile.png) 根据描述,我们发现它是从`fs.stat()`中来的,再去看看 ![](http://opkslf6o7.bkt.clouddn.com/js-lesson6-statSync.png) ----------分界线--------- (此处只是给出一种实现方式,如果感觉陌生请跳过,并不影响后续内容的理解) 如何判断文件名是否是.json结尾呢?我们可以使用`正则表达式` ``` 维基百科:正则表达式,(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。 ``` Google搜索“javascript中的正则表达式用法”,去模仿一下用法即可。 ----------分界线结束---------- **模仿&实现在自己的代码中** ```javascript for (var index = 0; index < files.length; index++) { if (!fs.statSync(readDirPath + files[index]).isFile()) { console.log('[Warning] ' + files[index]+ ' 不是文件,跳过'); } else if (files2[index].match('\.json$') == null ) { console.log('[Warning] ' + files[index]+ ' 不是json,跳过') } else { fs.writeFileSync(writeFilePath, files[index]+'\n'); } } ``` 执行一下,成功! ![](http://opkslf6o7.bkt.clouddn.com/js-lesson6-judgefile-output.png) 再看看输出txt文件,诶,有问题! ![](http://opkslf6o7.bkt.clouddn.com/js-lesson6-wrong-txt.png) 奇怪,为什么txt中只有一个文件名?如果再运行几次,得到的结果一样;再仔细观察,发现是最后一个文件名。思考一下原因: - 很可能是在for循环中,每次执行`fs.writeFileSync`都会清空之前的数据,重新写入 - 所以每写入一个新名称,前面的内容都被清除了,最终只能留下最后一个名称 怎么解决?还是要去文档中找答案!我们仔细看看`fs.writeFileSync`的说明: ![](http://opkslf6o7.bkt.clouddn.com/js-lesson6-writefilesync.png) 发现里面还有一个`option`参数,默认取值是`w`,在文档中搜搜看这表示什么意思?我们搜到了如下结果: ![](http://opkslf6o7.bkt.clouddn.com/js-lesson6-flag-desc.png) 通过学习我们发现,`a`是可以追加写入的,因此我们把参数进行修改 ```javascript fs.writeFileSync(writeFilePath, files[index]+'\n', {flag: 'a'}); ``` 终于大功告成啦! ### 总结 由于平时工作任务较多,本文零零散散竟然写了三天,惭愧! 写此文的目的是,很多同学以前没有写过代码,面对vscode这个黑窗口可能大脑一片空白,不知道应该如何整理思绪。 这次刚好以lesson6作业代码为主题,把自己完成作业时的所思所想梳理成文字,希望能从以下方面对小白同学有所帮助: - 遇到问题很正常,踩的坑越多提高才越快 - 遇到问题不要懵,要学会下面的思维方式 - 完成思考解决方案-搜索可用功能-模仿官方文档-写出可用代码的全过程 - 通过实战不断提高 欢迎到lesson6文件夹查看我的最终代码`caozhen.js`,指出错误,共同进步! ================================================ FILE: homework/lesson6/chenrushan.js ================================================ const fs = require('fs'); const dirPathString = '../../../words-from-the-heart/words'; const filePathString = '../../../test-code/write_file_async.txt'; fs.readdir(dirPathString, function (err, files) { if (err) { console.error('读取文件失败'); return; } if (files.length > 0) { fs.writeFile(filePathString, files, function (err) { if (err){ console.error('写文件失败'); } else { console.log('写文件成功'); } }); } else { console.log('没有找到任何文件'); } }); ================================================ FILE: homework/lesson6/chenyanxing.js ================================================ /* *第六课作业 陈燕杏 * *异步方案 */ //引入fs模块 var fs = require('fs'); //定义要查询的目标文件夹。 var dirPathString = '../../../words-from-the-heart'; //定义要写入的文件路径 var filePathString = './write_file_async_cyx.txt'; //定义一个callback函数,用于接收读取文件夹内容的结果 function read_callback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { //调用fs的writeFile函数,将读取的内容写进目标文件(这个地方的修改参考Wei同学的作业,实在太cool了!) var fileContent = files fs.writeFile(filePathString, fileContent, write_callback); } else { console.log('没有找到任何文件'); } } //定义一个write_callback函数,用于收写文件的返回结果 function write_callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.readdir(dirPathString, read_callback); /*使用异步方案中,参考同学的作业,发现自己写的漏洞随即改了过来: 1.读取文件和收写文件两次callback命名不能用没有意义的名字,比如:函数名+数字1,2。 2.参考老师的教材,原封不动把‘’读取文件‘’和‘’收写文件‘’,单独两部分写在json里,虽然终端可以跑起来,但是却只得到两句话“写文件成功‘’,显然是不合适的,也没有达到作业的目的。 */ /* *同步方案 */ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。 var dirPathString = '../../../words-from-the-heart'; //指定读取后所写入的文件的存放路径,名称和格式 var outputPathString = './write_file_sync_cyx.txt'; //读取内容并赋值给写入文件 var outPutFileContent = fs.readdirSync(dirPathString); //调用fs的writeFileSync函数来写文件 fs.writeFileSync(outputPathString, outPutFileContent); ================================================ FILE: homework/lesson6/chenziwen.js ================================================ // # 扫描某个文件夹的所有内容 # /* =====================================同步方案Start */ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。 var dirPathString = '../../../words-from-the-heart'; // 调用fs.readdirSync()方法读取目录内容,并把结果赋值给files,打印files var files = fs.readdirSync(dirPathString); console.log(files); /* =====================================将内容写入到文件中 */ // 定义要写入的文件路径 var outputPathString = './write_file_sync.txt'; // 定义文件内容变量fileContent var fileContent = files; //调用fs的writeFileSync函数来写文件 fs.writeFileSync(outputPathString, fileContent); /* =====================================同步方案End */ ================================================ FILE: homework/lesson6/cloudyview.js ================================================ //引入fs模块 const fs = require('fs'); //定义reddir需要的path var dirPathString = '../../../words-from-the-heart'; // var dirPathString = './';//调试用的路径 // var dirPathString = '../../homework/lesson1';//调试用的路径2 //定义写入的文件路径和文件名 var filePathString = './cloudyview_file_writing.txt'; //定义函数将信息写入这个函数的files变量里面 function callback(err , files) { if (err) { console.log('读取文件失败'); } //希望格式上能够好一些,加入分行的符号,结果发现用appendFile会更好些。对格式有强迫症,没办法。。。 //我本来希望能够起2个函数,其中一个函数能够单纯是写文件的。但是没找到将数据通过回调函数输出给写函数的办法。 if (files.length > 0) { console.log('有文件啊!!!') for (i = 0 ; i < files.length ; i++ ) { // fs.writeFile(filePathString , files[i] , writeCallback); //这样会不断重写文件。 var fileDate = i + '.\n' + files[i] + ',' + '\r\n' ; fs.appendFile(filePathString , fileDate , writeCallback); } }else{ console.log('没有文件存在!'); } } function writeCallback(err) { if (err) { console.log('writing files faild!'); } else { console.log('succeed! you just done!'); } } //定义回调函数 function fileListCallback(files) { console.log('writing file'); console.log(files); } //执行查询的函数 fs.readdir(dirPathString , callback); //调用fs的写函数来写入文件 ================================================ FILE: homework/lesson6/cuimiao.js ================================================ //第6课 小白cuimiao的作业 //引入fs模块 var fs =require('fs'); //定义查询文件的目标文件夹 var dirPathString = '../../../words-from-the-heart'; //定义一个callback函数,用于接受读取文件的返回结果 function callback(err,files){ if (err){ console.log('文件读取失败'); return; } if(files.length>0){ console.log(files); }else { console.log('没找到任何文件'); } } //用fs的readdir函数读取全部文件 fs.readdir(dirPathString,callback); //将读取到的文件名称写到txt文件中 var filePathString = './cmwrite_async.txt'; //定义文件夹内容变量 var fileCount = fs.readdirSync(dirPathString); //定义一个callback函数用于接受写文件的返回结果 function writecallback(err) { if (err) { console.log('文件写入失败'); } else { console.log('文件写入成功'); } } //调用fs的writeFile函数来写入文件 fs.writeFile(filePathString,fileCount,writecallback); //总结 //1.函数如果是自己定义的,要什么参数,自己要弄明白;如果是第三方库提供函数,则要看明白函数的定义,每个参数是做什么的,调用时怎么用参数 //2.参数的名称有时会一样,主要是为了少起名字 //3.有时要加入容错机制,比如作业以及老师课后的代码文档里,当出现err的时候,返回的文字内容,都是容错机制。 //4.老师鼓励我们改代码,都试一试,反正没损失。我这次做作业就尝试了一下,感觉还不错。 //5.内置库我们目前学了 console setTimeout typeof //6.file system 是nodejs环境的内置库 //7.搜索nodejs.api 第一个英文的文档是要阅读的,左侧的就是内置库,比如fs是我们重点学习的并做了作业 //8.犀牛书的前七章是基础,第八九章最重要,要认真反复阅读。 ================================================ FILE: homework/lesson6/cuiyuwei.js ================================================ /*同步读取、写入文件,参考曹振同学的作业,感觉看nodejs documentation有点困难*/ // 引入FileSystem var fs = require('fs'); // 定义要读取的路径 var readDirPath = '/Users/Administrator/learningjs/words-from-the-heart/'; //写入读取回来符合要求的文件的txt文件路径 var writeFilePath = '/Users/Administrator/learningjs/fileNameOfwordsheart_cuiyuwei.txt'; //判断读取路径是否存在,不存在做出警告 if(!fs.existsSync(readDirPath)){ console.log('读取路径不存在,请填写正确路径'); } else{ var files = fs.readdirSync(readDirPath); } /*对读取回来的结果进行处理*/ for (var i = 0; i < files.length; i++) { if (!fs.statSync(readDirPath + files[i]).isFile()) { console.log('[Warning] ' + files[i]+ ' 不是文件'); } else if (files[i].match('\.json$') == null ) { console.log('[Warning] ' + files[i]+ ' 不是json') } else { fs.writeFileSync(writeFilePath, files[i]+'\n',{flag:'a'}); } } /*异步读取、写入文件,参考曹振同学的作业*/ // 引入FileSystem var fs = require('fs'); // 定义要读取的路径 var readDirPath = '/Users/Administrator/learningjs/words-from-the-heart/'; // 方案2:异步读取 异步写入 var writeFilePath = '/Users/Administrator/learningjs/fileNameOfwordsheart2_cuiyuwei.txt'; // 定义读取时的回调函数 function readCallback(err, files) { if (err) { console.log('读取路径失败'); } else { if (files.length > 0) { for (var i = 0; i < files.length; i++) { if (!fs.statSync(readDirPath + files[i]).isFile()) { console.log('[Warning] ' + files[i]+ ' 不是文件'); } else if(files[i].match('\.json$') == null ) { console.log('[Warning] ' + files[i]+ ' 不是json') } else{ fs.writeFile(writeFilePath,files[i]+'\n',{flag:'a'},writeCallback); } } } else { console.log('没有找到任何文件'); } } } // 定义写入时的回调函数 function writeCallback(err) { if (err) { console.log('write error'); } else { console.log('write success'); } } fs.readdir(readDirPath, readCallback); ================================================ FILE: homework/lesson6/dangfeipeng.js ================================================ var fs = require('fs'); // 最简单的实现,为了确保正确执行,应将此文件放在 words-from-the-heart 项目的 script 文件夹下(编码约定) var dirPathString = '../words'; var filePathString = './words_file_names.txt'; var fileNames = fs.readdirSync(dirPathString); if (fileNames.length > 0) { // 异步写入返回值 err 可以明确判定写入是否成功,而同步写入只返回了 undefined,意义不明,所以采用异步写入 fs.writeFile(filePathString, fileNames, function (err) { if (err) { console.log('文件写入失败'); } else { console.log('文件写入成功'); } }); } else { console.log('读取文件失败'); } ================================================ FILE: homework/lesson6/dengxy0907.js ================================================ var fs =require('fs');//引入fs模块 var dirPathString = '../paixu/WORDS-FROM-THE-HEART';//定义要查询的文件夹 var files =fs.readdirSync(dirPathString); var needFiles= []; (function filesContent(){ for(i=0;i 0) { var fileContent = files; fs.writeFile(filePathString, fileContent, callback1); } else { console.log('没有找到任何文件'); } } fs.readdir(dirPathString, callback); var filePathString = './write_file_async.txt'; function callback1(err) { if (err) { console.log("写文件失败"); } else { console.log('写文件成功'); } } ================================================ FILE: homework/lesson6/fangqingyang.js ================================================ var fs = require('fs');//导入这个模块 var outputPathString = './name.txt';//要写入名字的文件,如果没有则自动创建一个 var inputPathString = '../../homework/lesson1';//这里是要导入的文件名的位置 var files = fs.readdirSync(inputPathString); //让写入的名字分行 if(files.length > 0){ for(var i = 0;i < files.length; i++){ files[i] = files[i] + '\n'; } } //回调函数,作用是告诉调用者,写文件的结果 function callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.writeFile(outputPathString,files,callback); ================================================ FILE: homework/lesson6/fanliao.js ================================================ var fs = require('fs'); var dirPathString = './'; function callback(err, files) { if (err) { console.log('读取文件失败'); } if (files.length > 0) { var filePathString = '../xlh.txt'; var fileContent = files.join("\n"); fs.writeFile(filePathString, fileContent, call); } else { console.log('没有找到任何文件'); } } fs.readdir(dirPathString, callback); function call(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } ================================================ FILE: homework/lesson6/fengkai.js ================================================ /* 同步方案 */ // 读取 var fs = require('fs'); var dirPathString = './words-from-the-heart'; var files = fs.readdirSync(dirPathString); console.log(files); // 写入 var outputPathString = './worksFromTheHeart.txt'; var fileContent = files; fs.writeFileSync(outputPathString, fileContent); /* 异步方案 */ //读取 var fs = require('fs'); var dirPathString = './words-from-the-heart'; function callback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { console.log(files); } else { console.log('没有找到任何文件'); } } fs.readdir(dirPathString, callback); //写入 var filePathString = './wordsFromTheHeart01'; var fileContent = fs.readdirSync(dirPathString); function callbackforwrite(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.writeFile(filePathString, fileContent, callbackforwrite); ================================================ FILE: homework/lesson6/hanwei.js ================================================ /* * 异步方案 * * 扫描'words-from-the-heart'文件夹的所有内容 *并将内容写入到上机目录test文件中 */ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。 var dirPathString = '../../../words-from-the-heart'; // 定义要写入的文件路径 var filePathString = '../../../test.txt'; // ----------------------------------- // 异步方案 // 定义一个read函数,用于接收读取文件夹内容后的结果 function read(err, files) { if (err) { console.log('读取文件失败!') return; } if (files.length > 0) { console.log(files); // 调用fs的writeFile函数来写文件 fs.writeFile(filePathString, files, write); } else { console.log('没有找到任何文件!') } } // 定义一个write函数,用于接收写文件的返回结果 function write(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } //调用fs的readdir函数读取所有文件 fs.readdir(dirPathString, read); ================================================ FILE: homework/lesson6/haohu.js ================================================ var fs = require('fs') var dirPathString = '../lesson1' var txtPathString = './haohu.txt' function readCallback(err, files) { if (err) { console.log('读取文件失败') return } if (files.length > 0) { writeToTxtFile(files) } else { console.log('没有找到文件') } } function writeCallback(err) { if (err) { console.log('写入文件失败') } else { console.log('写入文件成功') } } function writeToTxtFile(filesArray) { fs.writeFile( txtPathString, filesArray.join("\n"), writeCallback ) } fs.readdir( dirPathString, readCallback ) ================================================ FILE: homework/lesson6/hewei.js ================================================ var fs = require('fs'); var path = require('path'); /* 定义徐老师的 words-from-the-heart 项目在本地硬盘上相对于本 js 文件的位置 最初定义的路径是相对于本 js 的相对路径,但是在后面的执行过程中发现 如果在终端中分别从项目根目录执行本 js 文件,和从 js 所在目录执行本 js 文件 得到的结果是不同的,由于 js 文件位于 homework/lesson6 目录下 从项目根目录执行本 js 文件的话,js 获取到的 words-from-the-heart 项目的路径是错的 研究了接近一个小时,最终才找到了解决办法 用 fs.realpathSync 获取到本 js 文件的绝对路径后,再用 path.join 结合 ./../../words 就可得到 words-from-the-heart 的绝对路径 */ var directoryString = path.join(fs.realpathSync(__dirname), '../../../words'); /* 设置输出文件的路径,这也是个坑! 如果设置路径为 ./json_path.txt,并且执行本 js 文件时的当前路径不同的话 这个文本文件的保存路径也会变化 所以也是用 __dirname 获取当前文件绝对路径,以保证生成的 txt 文件的路径不会变 */ var txtPathString = path.join(__dirname, 'json_path.txt'); // 用于保存 json 文件名的字符串变量 var jsonFileName = ''; // Node.js API: Readline 读取用户输入 // https://nodejs.org/api/readline.html function processJsonFileNames() { var prompt = '\nWhich method do you like?\n\n' + '1. Use native JS\n' + '2. Use npm module - glob\n' + '3. Use native JS with recurvise method\n'; console.log(prompt); var readline = readline || require('readline'); var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); /* 这里是回调,所以取到用户的输入之后,在回调里执行后续的函数 */ rl.on('line', function (choice) { console.log('You have chosen: ' + choice); getJsonFileNamesFromDirectory(choice); rl.close(); }); } processJsonFileNames(); function getJsonFileNamesFromDirectory(userChoice) { switch (parseInt(userChoice)) { case 1: searchCurrentDirectory(); break; case 2: searchWithGlob(); break; case 3: searchRecursive(directoryString); break; default: console.log('Please make the right choice'); break; } if (parseInt(userChoice) != '2') { writeToFile(); } } function writeToFile() { if (jsonFileName.length == 0) { console.log('No json files found, is it right?'); return; } fs.writeFile(txtPathString, jsonFileName, function (err) { if (err) { console.log('Writing failed'); } else { console.log('File written'); } }); } /* json 文件查找方法一 只查找当前目录下的 json,不查找子文件夹里的 json 这个需求,直接用 fs.readdirSync() 就能实现了 */ function searchCurrentDirectory() { /* 如果采用异步方法,需要用回调,否则文件列表还没获取完 就会执行后面的代码,这时文件列表还是空的,肯定不行 */ var files = fs.readdirSync(directoryString); jsonFileName = ''; for (var i = 0; i < files.length; i++) { var currentFilePathPath = path.join(directoryString, files[i]); var stats = fs.statSync(currentFilePathPath); if (!stats.isDirectory() && files[i].endsWith('json')) { jsonFileName += files[i] + '\n'; } } // 上面的拼接方式会让字符串最后多出一个空行,要删掉 jsonFileName = jsonFileName.trim(); } /* json 文件查找方法二 直接用 npm 中现成的模块 glob,遍历当前文件夹及所有子文件夹 */ function searchWithGlob() { // glob 只在该方法中用到 // 所以就不放在文件的开头进行声明了 var glob = require('glob'); // 定义文件类型,设置完整搜索路径 var fileType = '**/*.json'; // 依然采用 path.join 生成完整路径,避免因系统不同导致手动设置路径出错 var fullSearchPath = path.join(directoryString, fileType); jsonFileName = ''; /* 注意:glob 方法获取到的文件路径是完整的绝对路径 而且 glob 是通过回调返回结果的,所以写入文件的函数必须在回调中调用 */ glob(fullSearchPath, function (err, files) { if (!err) { if (files.length === 0) { console.log('No json found'); return; } for (var i = 0; i < files.length; i++) { var stats = fs.statSync(files[i]); if (!stats.isDirectory() && files[i].endsWith('json')) { jsonFileName += path.basename(files[i]) + '\n'; } } // 上面的拼接方式会让字符串最后多出一个空行,要删掉 jsonFileName = jsonFileName.trim(); // 然后将结果写入文件 writeToFile(); } else { console.log('Unable to write file'); } }); } /* 在工作中有时候可以像方法二那样,找到能搞定问题的解决方案就行 但是在学习的时候,还是应当攻克每一个难关,这样才有进步 如果只是一味地复制 Google、StackOverFlow 上的代码 那么不管有多少年工作经验,都是不会有什么成长的 */ /* 在终端里查看 words-from-the-heart 这个仓库 会发现仓库里不只是有 json 文件,还有其他扩展名的文件 而且还有文件夹,而 fs.readdirSync() 只扫描根目录下的文件 对于子文件夹里的文件,这个方法是不会去扫描的 所以,就需要用递归调用的方法,来遍历整个仓库里的所有文件夹 这样才能找到所有的 json 文件 */ /* json 文件查找方法三 遍历当前目录及所有子文件夹 */ function searchRecursive(pathString) { jsonFileName = traverse(directoryString); var json = ''; for (var p in jsonFileName) { if (jsonFileName[p]) { json += jsonFileName[p] + '\n'; } } jsonFileName = json; } function traverse(dir) { var files = fs.readdirSync(dir); // 如果定义该变量为字符串,并用 result += file + '\n' 的形式拼接文件名 // 最后输出的txt文件是每个字母一行的,而不是像方法一那样每个文件名占一行 // 目前还没想出来是什么原因 var result = []; // files.reduce(function (files, file) { fs.statSync(path.join(dir, file)).isDirectory() ? traverse(path.join(dir, file)) : (file.endsWith('.json') ? result.push(file) : null) }); return result; } ================================================ FILE: homework/lesson6/hitchhacker.js ================================================ var fs = require('fs'); //同步方案 var dirPathString = './'; var files = fs.readdirSync(dirPathString); console.log(files); var outputPathString = './write_file_sync.txt'; fs.writeFileSync(outputPathString, files); //异步方案 outputPathString = './write_file_async.txt'; // 定义一个callback函数,用于接收读取文件夹内容后的结果 function callback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { console.log(files); //读完后写文件 fs.writeFile(outputPathString, files, callback2); } else { console.log('没有找到任何文件'); } } // 定义一个callback2函数,用于接收写文件的返回结果 function callback2(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } //异步回调之实现 setTimeout(function(){ fs.readdir(dirPathString, callback); },3000) console.log("hahaha"); ================================================ FILE: homework/lesson6/huangjiashu.js ================================================ fs = require('fs')//引入头文件 /** * 获取指定路径下文件列表 * 使用的是异步函数,因此不能使用立即返回,用callback传递数据 * @param {*} dirPath 文件路径 */ function readFileList(dirPath,writeToFile){ // 对传入参数进行判断 if (!dirPath) { console.log('路径不能为空') return null; } if(typeof writeToFile != 'function'){ console.log('%s is not a function',writeToFile); return; } //读取文件列表 fs.readdir(dirPath,function(err,files){ //处理错误 if (err){ console.log('读取文件列表失败:%s',err) return; } //处理文件列表为0的情况 if (files.length === 0){ console.log('未找到任何文件'); return; } console.log("+++++++++++++++++++") //处理找到的文件 filesStr = files.join(',') console.log(filesStr) writeToFile('realHeatFileName.txt',filesStr.toString()) }) } /** * * @param {*文件内容} contents * @param {*文件路径} filePath */ function writeToFile(filePath,contents) { if (!filePath || !contents || contents.length === 0) { console.log('路径不能为空或内容不能为空') return; } //写文件操作 fs.writeFile(filePath,contents,function(err){ if (err){ console.log('文件写入失败:%s',err) } else { console.log('文件写入成功') } }) } //执行函数 var dirPath = '../../homework/lesson1' readFileList(dirPath,writeToFile) /** * 此文件在作业第六次的作业目录下,可以直接运行。生成的文件默认也存储在此作业目录下。 * 很遗憾的一点是 每个函数都应该尽可能独立,而我写的函数readFileList 本来是只负责读取文件列表的。 * 然后要写文件 需要使用 回调。 这本身没什么问题。 * 问题是我的writeFile 需要一个文件路径参数。因为单独作为一个写文件函数,这个参数是必要的。 * 但在回调时 没法给这个参数 所以我只能写死了,那么这个函数其实就很烂了。 * 我要是把路径作为参数传递给readFileList,然后在传递给writeFile,那就不符合readFileList的本意了, * 读取文件列表这个函数不需要一个写入路径参数。 * */ ================================================ FILE: homework/lesson6/huyong.js ================================================ var fs = require('fs'); var dirPathString = '../../lesson6/words-from-the-heart'; var files = fs.readdirSync(dirPathString); console.log(files); var fs = require('fs'); var outputPathString = './write_file_sync.txt'; var fileContent = fs.readdirSync(dirPathString); fs.writeFileSync(outputPathString, fileContent); /*今天的作业作业我的理解就是一个填空题,按照老师给的同步异步代码,换上不同的路径和文件夹进行操作, 我们唯一要做的就是对于两段代码的连接,这是最难的,对吧老师? 我想老师的答案应该有四种结果,分别是 同步扫描对异步写入, 同步扫描对同步写入, 异步扫描对同步写入,异步扫描对异步写入, 最复杂的应该是两个都是异步,因为两个都是异步才是最难的,也最接近现实生活场景的代码解决方案, 老师我理解的对不对啊?☺今天异步对异步我还是没搞明白如何操作,我想我对于异步和值还有变量并没有完全理解清楚, 我的作业给出了最简单的答案,老师给点评下哦。 下面是我对真个课程的学习框架总结,后面慢慢写入细节,框架按照我学习到的东西进行分类 1,git操作, 2,如何在github上完成项目建立,如何协作, 3,js在前端和后端的运行框架, 4,两种交互 5,函数的理解 6,....... 老师我写的框架有没有少的啊? */ ================================================ FILE: homework/lesson6/jaykeyGuo.js ================================================ //引入FileSystem var fs = require('fs'); //定义读取路径 var dirPathString = '../../../words-from-the-heart/words'; //定义写出路径 var filePathString = "../write_words_async.txt" //定义写出回调函数 function callbackForWrite(err) { //检查 if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } //定义读取路径 function callbackForRead(err, files){ //检查读取路径 if (err){ console.log("读取文件失败"); return; } if (files.length > 0) { //调用写入 fs.writeFile(filePathString, files, callbackForWrite); } else { console.log("没有找到任何文件"); } } fs.readdir(dirPathString, callbackForRead); ================================================ FILE: homework/lesson6/jaykeyGuo.md ================================================ ### 基础-第六课 ```Javascript //引入FileSystem var fs = require('fs'); //定义读取路径 var dirPathString = '../../../words-from-the-heart/words'; //定义写出路径git revert HEAD var filePathString = "../write_words_async.txt" //定义写出回调函数 function callbackForWrite(err) { //检查 if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } //定义读取路径 function callbackForRead(err, files){ //检查读取路径 if (err){ console.log("读取文件失败"); return; } if (files.length > 0) { //调用写入 fs.writeFile(filePathString, files, callbackForWrite); } else { console.log("没有找到任何文件"); } } fs.readdir(dirPathString, callbackForRead); ``` ![mage-20180402102634](../../../var/folders/qx/m6xj9x1s02lbxjht9c3ljd500000gn/T/abnerworks.Typora/image-201804021026344.png) 今早收到的鼓励。 前两天在忙毕业论文的事情,这两天回归学习的主线,目标前端! 先回顾一下之前的内容: 对上述代码调用顺序的整理: > 1. 引入 fs > 2. 调用 fs.readdir > 3. callbackForRead,读取对应的files > 4. 调用 fs.writeFile > 5. callbackForWrite **这个部分还是有不少的疑惑,问题在于对应的fs的引入之后,写入和读取的调用顺序,我的理解是,先读取,后写入。** ------ 小结: 做作业的时候,知道读取的函数能够遍历整个目录,于是就将对应的写入的部分放在读取的下级,在每一次读取的时候能够进行写入,引入的fs,不是很懂原理,单从结果来看达到了目的。 ***留下的疑问,fs两个函数的嵌套是如何执行的?*** ================================================ FILE: homework/lesson6/jianglin.js ================================================ //引入fs模块 var fs = require('fs'); //要查询的文件夹 var dirPathString = 'words-from-the-heart'; //要写入的文件 var outputPathString = 'jianglin.txt'; var fileContent = new Array(); //查询回调函数。看了别的同学作业结合老师说的原则和推理,才改明白。原来在fs.readdir里的第二个函数参数里,必须要把查询到的内容调出去。也就是说,如果不直接输出的话,得在callback里用一个函数或者别的对象把得到的内容传出去,否则callback没意义。 function dirCallback(err,files){ if(err){ console.log('There is an error in reading.'); return; }else{ if(files.length > 0){ console.log('Reading is OK.'); //想添加换行符号,但是没有成功,只是加了空格 /*for(var i=0;i 0) { fs.writeFile(writePath, files, writeCallback) } else { console.log('没有找到任何文件'); } function writeCallback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } }; }; fs.readdir(readPath, readCallback); //相比上面同步的方法,fs.readdir()这里括号里面的参数有点变化 //同步里面只需要写入路径即可,就可以直接返回结果,而异步并不是直接返回结果,因此它有两个参数,一个是路径,一个是回调函数 //callback函数的参数(err,files 这些)可以有多个,网上说通常第一个参数保留给异常。 //其实意思就是在读取数据的时候首先应该考虑到异常情况处理。那么问题来了,既然都需要考虑异常情况,那同步拿来有什么用? //以上代码也可以直接把函数声明写到参数里面 var fs = require('fs'); fs.readdir('./', function (err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { console.log(files); } else { console.log('没有找到任何文件'); } fs.writeFile("./test.txt", files, function callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } }); }); //筛选json文件 //想筛选出json文件的名字,那肯定需要将所有的文件每个都甄别一遍,遍历数组,需要for循环语句。 //然后筛选,肯定是要判断条件,如果满足什么什么条件就怎么怎么地,嗯,要用if语句,先写出来 for (var i = 0; i < files.length; i++) { if (文件名以.json结尾为true) { 那么就把它写进test.txt } } //很痛苦的地方就在这里,怎么用代码描述“文件名以.json结尾”呢? //先想到的是去nodejs API的中文网上去搜。但是搜啥关键字呢,试了filter,search都没有找到合适的,也百度了还是没有头绪 //后来听群里的小伙伴说可以用endWith,就搜了一下endWith的用法,好像真的行。(老师可不可以分享一下搜索关键字的一些技巧?要不是同学提到endwith我都搜不出来) for (var i = 0; i < files.length; i++) { if (files[i].endsWith('.json')) { 那么就把它写进test.txt } } //接着就是中括号里面的内容了。相对之前的异步,其实就是多了筛选那部分,那么把这筛选的部分加进去后面接着写就好了嘛: for (var i = 0; i < files.length; i++) { if (files[i].endsWith('.json')) { fs.writeFile('./test.txt', files[i], writeCallback); } } //到这里我就蒙圈了,fs.writeFile括号里的第二个参数我是写files[i]和files呢? //这里就要先知道files和files[i]到底是什么? //在之前异步的代码里的files,是fs.writeFile的一个参数,指代的是写入的内容,很明显它是一个由多个文件名组成的数组,每一个文件名就是数组里面的元素。 //而files[i]就是files这个数组里面索引值为i的元素,类似arr = [1,2,3], arr[1]就是2。 //如果这里我写成files[i],从语法来讲,其实写入的是一个数据,并不是全部。最终我得到的结果是在test.txt里面写入了一个莫名其妙的值zhuyongjin.jsonnononn(我还没有想通为什么是这个值) //而其实我是想写出读出的整个数组,所以这时候其实应该用files才对。 for (var i = 0; i < files.length; i++) { if (files[i].endsWith('.json')) { fs.writeFile('./test.txt', files, writeCallback); } } //但是这样又不对了呀,这时候files是全部的数据,也就是没有筛选的全部文件名。所以给筛选的出来的结果再给个名字比如jsonFile,这样就行了吧? //这时候我又犯了难,通过for循环和if语句筛选出来的是一个一个值,而我想定义的是一个数组,要怎么表达这个数组和一个个元素的关系呢? //脑子里想的是jsonFile = [file[i],file[i+1],file[i+1+1],........],但是这样很明显不能用啊。 //然后我去看第七课的代码,才知道是可以定义空数组的。我先定义一个空数组,然后把通过for循环和if语句得到的一个个元素往里面添加,这样不就可以得到一个只有json文件名的数组了吗? var jsonFile = []; for (var i = 0; i < files.length; i++) { if (files[i].endsWith('.json')) { jsonFile.push(file[i]);//这里也费了一些功夫,刚开始看到第七课的代码时,还以为跟writerFile一样是个新的API呢,后来发现这不就是之前的课件里面数组增删改查的功能吗。。。默念“学以致用”三遍 fs.writeFile('./test.txt', jsonFile, writeCallback); } } //把这个弄好了,再把之前的异步代码套上,运行。2017年9月4日7点43分,发现居然成功了!老泪纵横! var fs = require('fs'); function readCallback(err, files) { if (err) { console.log('读取文件失败'); return; } var jsonFile = []; if (files.length > 0) { for (var i = 0; i < files.length; i++) { if (files[i].endsWith('.json')) { jsonFile.push(files[i]); } fs.writeFile('./test.txt', jsonFile, writeCallback); } } else { console.log('没有找到任何文件'); } } function writeCallback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.readdir("./", readCallback); //总算是把所有json文件的名字写到目标文件里了,但是有个问题,就是运行代码的时候会打印很多次“写文件成功”。 //仔细一看,原来是因为我把fs.writeFile('./test.txt',jsonFile,writeCallback)写到循环里面去了,把它挪出来: var fs = require('fs'); function readCallback(err, files) { if (err) { console.log('读取文件失败'); return; } var jsonFile = []; if (files.length > 0) { for (var i = 0; i < files.length; i++) { if (files[i].endsWith('.json')) { jsonFile.push(files[i]); } } fs.writeFile('./test.txt', jsonFile, writeCallback); } else { console.log('没有找到任何文件'); } } function writeCallback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.readdir("./", readCallback); //这样就只会打印一次“写文件成功” //谈一谈最近学习的感受: //还是那句话:越来越吃力啦。以前可能花个周末还能完成作业,现在感觉得花双倍时间。 //大群里面讨论的很多东西都看不懂了,幼儿园群似乎不是很活跃,我们的成长幼稚园群很热闹。 //这个群的名字是我取的,大家投票决定的。云飞还很不喜欢,感觉没有“屌丝逆袭学霸队”霸气,哈哈。 //取这个名字的时候,我就在想我们到底是为了什么聚集在一起的?当然,或许我们都抱着要变成学霸,要成为优秀的程序员的梦想,但对于小小小白来讲,对我们来说最重要的是什么? //我觉得是成长,自我的成长。人有时很容易跟别人相比较,然后自惭形秽,然后停滞不前,要不然为什么连问题都不敢问呢? //其实我们真正需要的不是跟别人比较后“我还不错”的那种优越感,而是今天的我跟昨天的我相比是不是进步多了一点? //离课程结束的时间不多了,这个月后我也要从上海回到成都,工作生活可能都会有很大的变化,但是学习还会继续。 //最开始学这门课,可能并没有像其他同学那样的雄心壮志,只是碰巧知道编程很重要,碰巧在情绪最不好的时候,碰巧看到了这门课,碰巧报了名而已。 //想来都是巧合,结果却令人意外。 //你如果问我学到了什么?我不会告诉你我知道了JS的运行环境框架,知道了同步函数异步函数,学会了一些电脑端的命令,会简单写几行代码,我会告诉你这门课教给我最重要的事情是:把学习当作一种习惯。 //现在在我们的幼稚园里,大家每天在群里打卡学习,相互答疑解惑,每天都有收获的感觉实在是太好了! //谢谢老师和同学们的陪伴! //继续加油! ================================================ FILE: homework/lesson6/lichen_async.js ================================================ /** * 异步方案 */ //引入 file system 模块 var fs = require('fs'); //定义要扫描查询的路径 var dirPathString = '../../../words-from-the-heart'; //定义要写入txt文件路径 var writePathString = '../../homework/lesson6/write_name.txt'; //定义一个 callbackScan 函数,用于接收读取文件结果 function callbackScan(err, files) { if (err) { console.log('Caution: 读取文件失败!'); return; } if (files.length > 0) { var fileContent = fileArrayToString(files); fs.writeFile(writePathString, fileContent, callbackWrite); } else { console.log('Alert: 没有找到任何文件!'); } } //定义一个 fileArray 函数,用于将 files 转为逐行打印的字符串 function fileArrayToString(files) { var returnString = []; // var returnString = ''; for (var i = 0; i < files.length; i++){ returnString += i + 1 + '. ' + files[i] + '\n'; } return returnString; } //定义一个 callbackWrite 函数,用于接收写入文件结果 function callbackWrite(err) { if (err) { console.log('Caution: 写入文件失败!'); } else{ console.log('Success: 写入文件成功!'); console.log('文件路径:' + writePathString); } } // 第一步一定是先读取dirPathString下的所有文件,将内容返回给callbackScan fs.readdir(dirPathString, callbackScan); ================================================ FILE: homework/lesson6/lichen_sync.js ================================================ /* * 同步方案 * * 扫描某个文件夹的所有内容 */ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。如果你想查lesson2的内容,就修改下面路径字符串。 var dirPathString = '../../../words-from-the-heart'; // 定义要写入的文件路径 var writePathString = '../../homework/lesson6/write_name.txt'; var files = fs.readdirSync(dirPathString); function fileArrayToString(files) { var returnString = []; // var returnString = ''; for (var i = 0; i < files.length; i++){ returnString += i + 1 + '. ' + files[i] + '\n'; } return returnString; } // --------------------------------- // 同步方案 //调用fs的writeFileSync函数来写文件 fs.writeFileSync(writePathString, fileArrayToString(files)); console.log('Success: 写入文件成功!'); console.log('文件路径:' + writePathString); ================================================ FILE: homework/lesson6/limingxing.js ================================================ /* * 扫描某个文件夹的内容,并将内容写入txt文件中 */ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹 var dirPathString = '../../../words-from-the-heart'; // 调用fs的readdirSync函数来读取文件 var files = fs.readdirSync(dirPathString); console.log(files); // 定义要写入的文件路径 var filePathString = './wish_filename.txt'; // 定义文件内容变量 var fileContent = fs.readdirSync(dirPathString); // 定义一个callback函数,用于接收写文件的返回结果 function callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } // 调用fs的writeFile函数来写文件 fs.writeFile(filePathString,fileContent,callback); ================================================ FILE: homework/lesson6/lingxiao.js ================================================ /* *扫描某个文件夹的所有内容,并将文件中文档名字打印输出 *下面用同步和异步两种方式输出 */ // 同步方案 // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。如果你想查lesson2的内容,就修改下面路径字符串。 var dirPathString = '../../homework/lesson1'; console.log(dirPathString ); var files = fs.readdirSync(dirPathString); console.log(files); // 定义要写入的文件路径 var outputPathString = './lingxiaoSync.txt'; // 定义文件内容变量fileContent var fileContent = files; //调用fs的writeFileSync函数来写文件 fs.writeFileSync(outputPathString, fileContent); // 异步方案 // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。如果你想查lesson2的内容,就修改下面路径字符串。 var dirPathString = '../../homework/lesson1'; // 定义一个callback函数,用于接收读取文件夹内容后的结果 function read_callback(err,files) { if (err) { console.log('读取文件失败'); } if (files.length > 0) { console.log(files); var filePathString = './lingxiaoAsync.txt'; var fileContent = files; fs.writeFile(filePathString, fileContent, write_callback); console.log(files.length); //console.log(Buffer); } else { console.log('没有找到任何文件'); } } //调用fs的readdir函数读取所有文件 fs.readdir(dirPathString,read_callback); // 定义一个callback函数,用于接收写文件的返回结果 function write_callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } ================================================ FILE: homework/lesson6/lipeng.js ================================================ /* * 第6课作业 李朋 * * 异步方案 */ // 引入fs模块 var fs = require('fs'); // 定义要读取的文件夹路径 var dirPathString = '../../../words-from-the-heart/'; // 定义要写入的文件路径 var outputFilePathString = './persons.txt' // 定义回调函数,用来处理扫描文件夹的结果 function readCallback(err, files){ if(err){ console.log('读取文件夹失败'); } if(files.length >0){ // 调用fs的writeFile函数写文件 fs.writeFile(outputFilePathString,files,writeCallback); }else{ console.log('没有找到任何文件'); } } // 定义回调函数,处理写文件返回结果 function writeCallback(err){ if(err){ console.log('写文件失败'); }else{ console.log('写文件成功'); } } // 调用fs的readdir函数来读取文件夹 fs.readdir(dirPathString,readCallback); ================================================ FILE: homework/lesson6/liujuanjuan1984.js ================================================ /* 第6课的作业: 需求:写一个整理文件名的js脚本,即扫描文件夹,把读到的文件名写入到一个txt文件。 要求:该js脚本以自己名字来命名 */ //调用fs这个服务 var fs = require('fs') //扫描目录地址,扫描结果写入文件; //这个文件即便不存在也会自动创建;如果已存在会被覆盖。 //交作业时的地址 var scanPathString = '../lesson2'; var writePathString = './files-results.txt'; /* //我在本地调试的地址 var scanPathString = '../sample'; var writePathString = './files-results.txt'; */ function scanCallback(err, files){ //出错提醒;我故意设置了一个不存在的文件夹为扫描路径,会触发这个报错 if(err){ console.log('扫描文件报错了'); return; } //空文件夹提醒,readdir的结果存在files这个参数里,是个数组 if(files.length > 0 ){ //本行仅是显示屏打印,读取其实是js.readdir做的工作。所以也可以不打印到终端。 //console.log('正在扫描\n'+files); //创建一个数组,用来存储结果;实际上这个callback本身就会存储在files这个参数里。 var filesList = [] for (var i = 0; i < files.length; i++) { filesList.push(files[i]); //console.log(files[i]) } //console.log(filesList); //把files这个数组内容,逐个写入文件。 //但输出结果很奇怪。没有逐行写入,而且会写不完整。但循环确实完成了指定次数。 //但这至少解释了一点,files如何从读取函数跑到写入函数那里。 //用writeFile同步方式,会有乱七八糟的效果 //而用异步方式则只剩下最后一个,因为被覆盖了 fs.writeFile(writePathString,filesList,writeCallback) //fs.writeFileSync(writePathString,filesList) //for (var i = 0; i < files.length; i++) { //fs.writeFileSync(writePathString,files[i],writeCallback) //} }else{ console.log("这个目录下没有任何文件"); } } //定义一个写入文件的反馈函数 function writeCallback(err,files){ if(err){ console.log("写文件报错") }else{ console.log("写文件成功") } } fs.readdir(scanPathString,scanCallback); //疑问:fs是什么,require fs就成功了, 这叫什么? //疑问:readdir是什么,fs.readdir就直接调用了,这叫什么? //readdir有2个参数,分别有什么要求? //定义了callback函数,但调用它的时候并没有给它参数,怎么回事? //这个脚本运行后,结果只有一个undefined,不知道为什么。 /* 作业过程中产生的疑问与答案: 1、 最初我用了fs.readdir,写入文件的结果是undefined;查看刘胜新的作业,改成fs.readdirSync就成功了。 不知道为什么。 带Sync的是同步处理。不带,是异步。 猜测是: fs.readdir的返回值,是未定义。 fs.readdirSync的返回值,居然正确? 2、 我把scanCallback的err参数及对应代码去掉,结果报错了,说files.length无法找到。 不知道为什么。 3、 //向刘胜新学习用fs.readdirSync并移除下面这个回调的调用。代码是能跑通的,但逻辑有缺口。 //刘胜新用fs.readdirSync没有scanCallback回调,而我b回调也能跑,但实际上没调用这块代码。可能是可选参数。 // //测试下如何把一个函数的运行结果赋值给一个变量 function test(){ console.log('text for log'); return "back for back" } var doc = test(); console.log(doc); //结论是,把没有return的函数赋值给变量,打印变量就是undefined */ ================================================ FILE: homework/lesson6/liujun.js ================================================ var fs = require('fs'); var dirPathString = '../../../words-from-the-heart'; var filePathString = './info.txt'; function readCallback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { console.log(files); var fileContent = files; fs.writeFile(filePathString,fileContent,writeCallback) } else { console.log('没有找到任何文件'); } } function writeCallback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.readdir(dirPathString, readCallback); ================================================ FILE: homework/lesson6/liuliyuan.js ================================================ //异步 var fs = require('fs'); var dirPathString = '../../../words-from-the-heart'; function scan_callback(err,files) { if (err) { console.log('读取文件失败'); } if(files.length > 0) { console.log(files); var filePathString = './liuliyuanAsync.txt'; var fileContent = files.join("\n"); fs.writeFile(filePathString, fileContent, write_callback); console.log(files.length); } else { console.log('没有找到任何文件'); } } fs.readdir(dirPathString,scan_callback); function write_callback (err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } ================================================ FILE: homework/lesson6/liuliyuan.md ================================================ #JS 第六节 2017.08.26 **心理建设:** 刚开始听说要做这个,觉得好难啊,自己还没有独立写过代码,有点怵的慌。但是大早上起来也无所事事,我就想先看老师study/lesson6中的代码吧,肯定有给提示的。 于是就开始做了,打开看了下是四个文件,分别是scan和write的文件,分别有两个,一个是同步,一个是异步。看了一下,分别运行了一下代码,觉得这不就是把两个代码放在一起就可以了嘛,一个扫描,一个放在txt格式的文件中。 这时觉得自己so clever,于是就喜滋滋开始做了。开始在一个新的js文件中一行行抄老师的代码。其中有几个让自己把之前so clever的想法全盘抛弃的节点,下面总结出来,让自己明白:熟能生巧,不是你不能巧,而是还不熟。 ##异步 ###问题1、定义要查询的目标文件夹 dirPathString使用的是相对路径的方式找到要读取的文件夹的。也就是说你现在运行的这个JS代码的文件夹才是坐标的原点,你要根据这个文件的坐标去找你要读取的文件夹的位置。 比如我们的作业中,我们的作业JS代码按要求是要放在homework下的lesson6中的,而我们要读取的是words-from-the-heart的文件夹,那么你需要退回到homework,然后退回到getting-started-with-javascript,再退回到my_project中,你才能在这个文件夹中打开words-from-the-heart的文件夹,于是代码就是: > '../../../words-from-the-heart **Notice**:刚开始搞不懂可以一直试,运行后下面报错就是我们学习的最好资料。反正电脑也不会崩,怕啥(当然,觉得自己有点蠢,那也没关系,人生难得几回蠢)。 ###问题2、fileContent write文件中与scan程序类似,运行老师的代码,就会发现会出现一个TXT格式的文件,里面写着“Hello,JS”。这是因为fileContent变量被定义赋值为'Hello,JS'。我们的目的是让之前扫描文件夹中的文件名被写入txt文件中,因为扫描打印的是files,所以: >var fileContent = files; ###问题3、换行 代码写好后,运行,看到homework/lesson6中出现一个txt的文件,里面有62个文件(没有更新的情况下),但是所有的名字都在一行,完全懵,没法看。就想着怎么可以换行,做到一个文件夹名一行? 去网上搜索查到了换行符号(“\n”),就打在了files的后面,但是发现files不是函数,直接在后面打括号,那肯定要报错的,于是运行了一下,果然是。 继续查找,在别人的代码中发现join(),然后在网上查到用法: >join方法用于把数组中的所有元素放入一个字符串,元素是通过指定的分隔符进行分隔的。 那用join("\n")的方法应该可以,遂运行,成功(因为是要对内容修改,所以这是写在fileContent后面的,对问题2的补充。 代码: >var fileContent = files.join("\n"); ##同步 做完了异步,同步就很简单了,没有什么问题。 --- 做完了同步和异步,比较两者的代码,会发现同步的代码很简单,而异步的代码比较繁琐。其实还没有达到可以选择什么时候用同步,什么时候用异步的程度,只能照猫画虎。 还需要加强理解,现在的状态是只能看着例子,想着实际生活理解,还不能熟练,接下来一周的任务就是巩固之前的知识,开始认真看书的第二遍(第一遍太囫囵吞枣);跟上听课,完成作业(不计划做太多的课外拓展)。 ================================================ FILE: homework/lesson6/liushengxin.js ================================================ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。如果你想查lesson2的内容,就修改下面路径字符串。 var dirPathString = '/Users/jackmac/getting-started-with-javascript/homework/lesson5'; // 定义要写入的文件路径 var filePathString = '/Users/jackmac/getting-started-with-javascript/homework/lesson6/liushengxin_file_async.txt'; // 定义文件内容变量fileContent var fileContent = fs.readdirSync(dirPathString); // 定义一个callback函数,用于接收写文件的返回结果 function callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } //调用fs的writeFile函数来写文件 fs.writeFile(filePathString, fileContent, callback); ================================================ FILE: homework/lesson6/lixiang.js ================================================ var fs = require('fs'); //引入fs模块 var dirPathString = './'; // 定义要查询的目标文件夹为当前文件 var outputPathString = './lixiang.txt'; // 定义写入文件夹的路径和文件名 var names = []; // 这一步研究了两个小时,到底如何把读取出来的数组文件,转换为字符串写入新文件 // ---------------- 分割线以上 引入模块 及 定义变量,分割线以下定义函数 // 定义一个回调函数,筛选只有json后缀名的文件,这一步也花了差不多2小时 // 这里的callback (err,files)完全就是照搬模板,目前无法做到知其所以然,只知道这是一个回调函数,有两个参数 function callback(err, files) { if (err) { console.log('读取文件失败'); return; } for (var i=0; i 0) { console.log(files); fs.writeFile(filePathString, files, callback1); } else { console.log('没有找到任何文件'); } } function callback1(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } function scanAndWriteFiles_async(callback){ fs.readdir(dirPathString, callback); } scanAndWriteFiles_async(callback); ================================================ FILE: homework/lesson6/mindongquan.js ================================================ /* * 第6课作业,同步方案 * * 扫描某个文件夹的所有内容并写入一份txt文件 */ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。如果想查其他文件夹的内容,就修改下面路径字符串。 var dirPathString = '../../../words-from-the-heart'; // 定义要写入的文件路径 var writeFilePath = './write_file_sync.txt'; // 检查所查询的目标文件夹是否存在,返回的true值作为workFlow的参数 function dirPathTest(dirPathString) { if(!dirPathString) { console.log('参数错误!'); return false; }else if(!fs.existsSync(dirPathString)) { console.log('所查询的目录不存在!'); return false; }else { return true; } } //先将查询到的内容赋给filesName变量,再将其中的.json对象输出到目标文件 function collectJsonFilesNameToTxt(dirPathString) { var filesName = fs.readdirSync(dirPathString); // console.log('filesName的数据类型是 ' + typeof filesName); var jsonFileName = []; if(filesName.length === 0) { console.log('该目录为空!'); }else { for(index = 0; index < filesName.length; index++) { if(filesName[index].endsWith('.json')) { jsonFileName += filesName[index] + '\n'; } } // 最后一次循环导致末尾多一次换行,修掉 jsonFileName = jsonFileName.trim(); fs.writeFileSync(writeFilePath,jsonFileName); } } // 按老师课上提到的思路——将整体过程按步骤分到各函数,再用workFlow控制 function workFlow() { if(!dirPathTest(dirPathString)){ return false; }else{ collectJsonFilesNameToTxt(dirPathString); console.log('内容写入完毕,请打开write_file_sync.txt查看。'); } } workFlow(); /* 向老师提问 1. 第26行 }else { return true; } 除了return true 以外,还需不需要加别的内容? 2. 第54行 if(!dirPathTest(dirPathString)){ return false; if 在判断时,是否会执行dirPathTest函数的全部内容? 我在编写过程中,出现过不加!会执行,增加!后就不执行了。但是按照以上的编写内容,即使我故意制造dirPathTest中的几种错误,也会执行并console.log。 所以我疑问的核心就是究竟何时会执行一次函数?还是只要有dirPathTest(dirPathString的地方就执行一次?有没有只需要取它的return,而不用再执行一遍的方法? */ ================================================ FILE: homework/lesson6/ouyangchun.js ================================================ //ͬfsģ var fs = require('fs'); //ҪѯĿļС var dirPathString = '../words-from-the-heart'; var filePathString = '../js.txt'; var files = fs.readdirSync(dirPathString); fs.writeFileSync(filePathString,files); //첽 var fs = require('fs');//FSģ var dirfile = '../words-from-the-heart';//Ҫѯļ· var xierufile = '../js.txt';//Ҫдļ· function callback(err,files){ if (err){ console.log('ȡļʧ'); return false;//˳ǰѭ } if(files.length>0){ console.log(files); } else{ console.log('ûҵļ'); } };//ص fs.readdir(dirfile,callback)//FSģ var files = fs.readdirSync(dirfile) function writecallback(err){ if(err){ console.log('дļʧ'); }else{ console.log('дļɹ'); } }; fs.writeFile(xierufile,files,writecallback); ================================================ FILE: homework/lesson6/panyong.js ================================================ // --------------------------------- // 同步方案 function scan_write_files_sync(dirPathString,outputPathString) { // 引入fs模块 var fs = require('fs'); // 读文件名 var files = fs.readdirSync(dirPathString); // 写文件名 fs.writeFileSync(outputPathString,files); } scan_write_files_sync('../../../words-from-the-heart','./write_sync.txt'); // --------------------------------- // 异步方案 // 引入fs模块 var fs = require('fs'); var dirPathString = '../../../words-from-the-heart'; var filePathString = './write_async.txt'; var name="panyong"; function write_callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } function read_callback(err,files){ if(err){ console.log('读取文件失败'); return err; } if (files.length > 0) { fs.writeFile(filePathString, files, write_callback); } else { console.log('没有找到任何文件'); } } //调用fs的readdir函数读取所有文件 fs.readdir(dirPathString, read_callback); console.log(name); ================================================ FILE: homework/lesson6/qiujingyu.js ================================================ //同步方案 var fs = require('fs'); var dirPathString = '../../../words-from-the-heart/'; var files = fs.readdirSync(dirPathString); var outputPathString = './write_file_sync.txt'; fs.writeFileSync(outputPathString, files); //异步方案 var fs = require('fs'); var dirPathString = '../../../words-from-the-heart/'; var filePathString = './write_file_async.txt'; function callback(err, files) { if (err) { console.log('读取文件失败'); } if (files.length > 0) { console.log(files); fs.writeFile(filePathString, files.join("\n"), callback2); } else { console.log('没有找到任何文件'); } } fs.readdir(dirPathString, callback); function callback2(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } ================================================ FILE: homework/lesson6/readme.md ================================================ 【第六节课作业】帮我整理数据 在words-from-the-heart项目中收到了很多同学的心声。我想把这些json的文件名整理到一个txt文件中。但苦于文件里太多。请帮我写个整理文件名的脚本代码。 请参考study/lesson6的的代码,共4个文件。 关于相对路径的理解请参考:https://github.com/xugy0926/getting-started-with-javascript/blob/master/topics/%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84.md

 【作业内容】
 1. 以自己的名字命名一个js文件。 2.先扫描文件夹,再把读到的文件名写入到某个txt文件。 【特别注意】 只提交一个你命名的js文件即可,我只要代码。不要给我txt结果文件。

 【提交方式】
 1. 请向getting-started-with-javascript项目发起pull request。

https://github.com/xugy0926/getting-started-with-javascript

 2. 提交homework/lesson6目录下。 ================================================ FILE: homework/lesson6/shaozhen.js ================================================ /* 第六课作业 */ //同步方案 // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。 var dirPathString = '../../../words-from-the-heart'; //指定读取后所写入的文件的存放路径,名称和格式 var outputPathString = './wordsFromTheHeartName.txt'; //读取内容并赋值给写入文件 var outPutFileContent = fs.readdirSync(dirPathString); //调用fs的writeFileSync函数来写文件 fs.writeFileSync(outputPathString, outPutFileContent); //异步方案 var fs = require('fs'); var readPathString = '../../../words-from-the-heart'; var writePathString = './wordsFromTheHeartName2.txt'; // 定义一个read_callback函数,用于接收读取文件夹内容后的结果 function read_callback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { //将读取的内容写进目标文件 var fileContent = files fs.writeFile(writePathString, fileContent, write_callback); } else { console.log('没有找到任何文件'); } } //定义一个write_callback函数,用于接收写文件的返回结果 function write_callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.readdir(readPathString, read_callback); ================================================ FILE: homework/lesson6/shenzhili.js ================================================ /* * 尝试用同步读取文件名,用异步的方式写入文件名 * 此js文件放在words-from-the-heart文件夹下 */ var fs = require('fs'); var dirPathString = './'; var filePathString = './words-from-the-heart.txt'; var fileContent = fs.readdirSync(dirPathString); fs.writeFile(filePathString, fileContent,function(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } ); ================================================ FILE: homework/lesson6/sunyan.js ================================================ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹 var dirPathString = './words-from-the-heart-master'; /* * 同步方案 */ // 定义要写入的文件路径 var outputPathString = './write_file_sync.txt'; var files = fs.readdirSync(dirPathString); fs.writeFileSync(outputPathString, files); /* * 异步方案 */ // 定义要写入的文件路径 var filePathString = './write_file_async.txt'; //调用fs的readdir函数读取所有文件 fs.readdir(dirPathString, function (err, files) { if (err) { console.log('读取文件失败'); } if (files.length > 0) { console.log('读取文件成功'); var fileContent = files; //调用fs的writeFile函数来写文件 fs.writeFile(filePathString, fileContent, function callback_write(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } }); } else { console.log('没有找到任何文件'); } }); ================================================ FILE: homework/lesson6/tangjianfeng.js ================================================ var fs = require('fs'); var dirPathString = '../../homework/lesson1'; var outputPathString = './write_lesson1_sync.txt'; var files = fs.readdirSync('../../homework/lesson1') function callback(err, files) { if (err) { console.log('读取文件失败'); } else if (files.length >0) { console.log(files); } else { console.log('没有找到任何文件'); } } function callbackwrite(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.readdir(dirPathString, callback); fs.writeFileSync(outputPathString,files,callbackwrite() ); ================================================ FILE: homework/lesson6/taobao.js ================================================ // 引用内置库 const fs = require("fs"); const path = require("path"); // 定义要查询的目标文件夹。 const scanPathString = path.join(__dirname, "../../../words-from-the-heart"); // 定义输出的目标文件及其路径。 const writePathString = path.join(__dirname, "./homework3.txt"); // 保存的文件Striing; let saveScanFileString = ""; // 搜索的文件类型; let findFileType = ".json"; //写入文件function; function writeFile() { function callback(err) { if (err) { console.log("Failwriting"); } else { console.log("Sucesswriting"); } } fs.writeFile(writePathString, saveScanFileString, callback); } //扫描文件function; //提供:扫描 total 文件个数,扫描目标类型文件个数,文件夹个数和非目标文件个数; function scanFile() { function callback(err, files) { if (err) { console.log("Scan Fail"); return; } if (files.length != 0) { console.log("Find some files and folders"); var j = 0; var k = 0; var l = 0; var m = 0; for (var i = 0; i < files.length; i++) { var eachFilesPath = path.join(scanPathString, files[i]); var checkDirectry = fs.lstatSync(eachFilesPath).isDirectory(); if (checkDirectry == true) { l = l + 1; } if (files[i].endsWith(findFileType)) { saveScanFileString = saveScanFileString + files[i] + "\n"; j = j + 1; } else { k = k + 1; } } m = i - l; console.log("Total Find : " + i); console.log("There is/are " + l + " Directiory(ies)"); console.log("Total files : " + m); console.log(findFileType + " type files : " + j); console.log(k - l + "file(s) is/are not " + findFileType + " files."); saveScanFileString = saveScanFileString.trim(); writeFile(); } else { console.log("There is not any files."); } } fs.readdir(scanPathString, callback); } //写入代码嵌套在扫描代码中,不知到怎么做call back 来调取; scanFile(); /* Below this line, you can put in markdown to read it. -------------------------------------------------------- #lesson6_第六次作业_scanAndWrite This time homework, I spent almost 4 days on it. No matter how busy I was, I should done this 20 days ago. I will talk about something about lesson6 first, and later I will talk about me. --- lesson6 1. var, let, and const; At the beginning of study javascript, the prof from university, instructor Mr.Xu and most of textbook in the web, all of those teach with "var" at the beginning. However, this time when I read the node.js API, I found that some code not use "var", they prefer to use "const" and "let". ``` const fs = require('fs'); fs.unlink('/tmp/hello', (err) => { if (err) throw err; console.log('successfully deleted /tmp/hello'); }); ``` Maybe Mr.Xu taught in later lecture or he already mentioned this point and I missed it. I got some idea from internet. I have some questions and I will out at the end of this article. 2. how important for flow chart; When I write the version 2, I stop there for half of one day. Then later I try to draw the picture to slove the problem. I also felt happy while I typeing the version 3 homework3.js. I believed that I git the feeling as same as you coding in lesson 4. If everything follow my picture, I belive I can fly in coding. 3. relative and absolute path; I did not know the difference between relative and absolute path in node.js becasue I even did not know ``` 1. node lesson6\sample.js 2. node sample.js ``` that I can run sample.js by line 1 way. I always cd dir to the folder and run it like line 2. I tried to solve this problem with one whole day. The reason I can find this problem beacsue I go to saw Hewei's homework, I did three different version homework, and if you want you can find them in [lesson6 study](https://github.com/tiandimeihua/xinshengdaxue_javascript/tree/master/study/lesson6). After I finish the version 2 which is homework2.js, I do not know how to use callback make scan function and write function toghter, then I go to see hewei's howmwork. I found the proeblem with the path. I used the similar idead with him, but there have difference in code. 4. add some other task; After I read the code from hewei, he use three different ways to slove the problem in two versions. However, I only come out with one. Moreover, I add different features with him. I found the diffence between he and I. He can think more bigger than me. In the other word, he stands more higher than me now. In his code, I see some new I never see before. Maybe I need to finish reading the textbook. Yep, I must read it. --- Questions: 1. Can I use "const" and "let" to instead of "var" ? 2. How can I find what I need in the whole API ? Sometimes I do not know where to find it. For example, ``` .endsWith() ``` --- 没有及时的听课,自己的经历还少,精力不够,没有在8月底的时候把课程跟上,5以后直播也很少去看,还好14那天去看了直播,远在重洋,网络好差,坚持了20分钟,我放弃了。 刚刚看lesson6的时候,有好多话想和老师说,但是后来写作业的时候想想算了。谢谢老师。 --- 1. 老师上次批改我的作业说 形参和实参 可以点明以下么? 谢谢。 2. 微信群压了2000+的消息,因为没有及时的听课,怕被剧透,所以没有去看,要现在去看吗? --- 老师辛苦了。 -------------------------------------------------------- */ ================================================ FILE: homework/lesson6/tuyilang.js ================================================ /* * 异步方案 * * 扫描某个文件夹的所有内容 * * 将扫描的内容写入到文件中 */ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹,如果你想查询其他文件夹的内容,就修改下面的字符串。 var fileReadPathString = '../../../words-from-the-heart'; // 定义要写入的文件路径 var fileWritePathString = '../../../words-from-the-heart/file_list_async.txt'; //---------------------------------------------------- // 异步方案 // 定义一个read_Callback函数,用于接收读取文件夹内容再将其写入txt文件后的结果 function readCallback(err, files) { if (err) { console.log('读取文件失败'); } if (files.length > 0) { fs.writeFile(fileWritePathString, files, writeCallback); } else { console.log('没有找到任何文件'); } } // 定义一个writeCallback函数,用于接收写文件的返回结果 function writeCallback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } // 调用fs的readdir函数读取所有文件 fs.readdir(fileReadPathString, readCallback); /* for (var i = 0, j = 0; i < files.length; i++) { var index = files[i].lastIndexOf('.'); var extend = files[i].substring(index + 1); var fileContent = []; if (extend == 'jason') { fileContent[j] = files[i]; fileContent[j++] = "\n"; j++; } } */ ================================================ FILE: homework/lesson6/wangchangqing.js ================================================ //同步方案 var fs = require("fs"); var dirpathString = '../../../words-from-the-heart'; var files = fs.readdirSync(dirpathString); var outputPathString = '../../../words-from-the-heart/write_file-sync.txt'; fs.writeFileSync(outputPathString, files); //异步方案 var fs = require("fs"); var dirpathString = '../../../words-from-the-heart'; function callback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { console.log(files); } else { console.log('没有找到任何文件'); } } var filePathString = '../../../words-from-the-heart/write_file-async.txt'; function callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.writeFile(filePathString, files, callback); //输出倒是成功了,但是结果有点乱。 //想实现每个文件名之后自动换行,还有过滤掉所有非json文件,那样应该会美观很多。 //好像有的同学已经实现了这样的技术。比如“liuliyuan”的作业就成功实现了自动换行的技术。 //我模仿她的代码,加入var fileContent = files.join("\n");但是依然没有成功,不太清楚原因是什么。 //而且她的代码中似乎没有定义files,也依然成功输出了结果。我尝试了一下在自己的代码中不对files做赋值和定义,但是运行的时候报错了——not defined。这一点也不太清楚原因是什么。 //读了何伟同学的代码,好复杂!!几乎完全看不懂。膜拜大神 //老师挖的坑好多,不过感觉自己已经慢慢知道老师的套路了哈哈哈——“改”、“删”、“换”,陷阱多多,必须多加小心才行。 ================================================ FILE: homework/lesson6/wangganzy.js ================================================ var fs = require('fs'); var readDir = fs.readdirSync('./'); var filePathString = './write_file_async.txt '; function weixin(err){ if(err){ console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.writeFile(filePathString,readDir,weixin); ================================================ FILE: homework/lesson6/wangshasha.js ================================================ var fs = require('fs'); var files = fs.readdirSync("../../../words-from-the-heart"); console.log(files); function callback(err, files) { if (err) { console.log('文件写入失败'); } else { console.log('成功'); } } var OutPutPathString = './write_file_sync.txt' fs.writeFile(OutPutPathString, files, callback) ================================================ FILE: homework/lesson6/wangwei.js ================================================ var fs = require('fs'); var dirPathString = '../../../words-from-the-heart'; var files = fs.readdirSync(dirPathString); for(var i=0; i < files.length; i++) { var filesContent = filesContent + files[i] + '\n\n'; } var outputPathString ='../../../write_file.txt'; fs.writeFileSync(outputPathString, filesContent); ================================================ FILE: homework/lesson6/wangyunfei.js ================================================ // lesson 6 作业,整理“同学们的心里话” ---王云飞 // 按着老师的作业思路,方案有两个,一个是同步的方案,一个是异步的方案。 // 同步方案 var fs =require('fs'); var dirPathString='C:/Users/Administrator/my_project/words-from-the-heart'; var outputPathString='C:/Users/Administrator/desktop/zy5.txt'; var fileCount=fs.readdirSync(dirPathString) //console.log(fileCount); fs.writeFileSync(outputPathString,fileCount); // 先说说,同步方案,剔除掉 “打印日志”,一共5行代码,5行语句,从第一行,到第五行,按顺序执行。 //一、首先说说 "var fs=require('fs)",这是一个什么鬼东西。 // require('fs')的意思就是:“调出 “fs”模块这个功能, var fs 意思是用 fs 来作为他们的“代号”。 // "fs"是什么? fs 就是一个功能模块,它提供了文件的读取、写入、更名、删除、遍历目录等功能。并被封装在Node.js 文件系统中。 //二、值得注意的是:fs 模块中提供了“异步”和“同步“两个版本。 // 例如:读取目录:异步函数形式为:fs.readdir() ,同步为 fs.readdirSync()。 //三、fs 同步函数中,fs.writeFileSync(),括弧中,必须包含两个参数,一个是“待写入的文件名” 另一个是“内容”。 // 翻译一下:fs.writeFileSync(filename,date). filename,date必须是要是真是存在的 “实参” ,否则操作无效。 // 废话不多说,直接上 “异步方案” var fs =require('fs'); var dirPathString='C:/Users/Administrator/my_project/words-from-the-heart' var outputPathString='C:/Users/Administrator/desktop/zy3.txt'; function readcallback(err,files){ if(err){ console.log('读取文件失败'); return; } if(files.length>0){ fs.writeFile(outputPathString,files,writecallback); } else{ console.log('没有找到任何文件'); } } function writecallback(err){ if(err){ console.log('写入失败'); }else{ console.log('写入成功'); } } fs.readdir(dirPathString,readcallback); // 一、如果你是小白,你一定感觉这个异步案例很烧脑,恭喜你,你的感觉是对的。因为,我的感觉跟你是一样的。 // 烧脑怎么破,听我慢慢道来。 // 二、 首先,有几个点,我们必须搞清楚,本文中谁是 “fs” 异步函数,谁又是普通的异步函数,否则,就没法混了。 // 谁是fs异步函数呢,当然是 fs.readdir(..); ,fs.writeFile(...),因为他俩都前缀了“fs”。 // 那谁有是普通函数呢? 当然是: readcallback(err,files) 和writecallback(err)。 为什么呢,因为地球人都知道,如果你不知道,我有理由怀疑你是火星人。 // 三、整个异步方案就是围绕这4个函数,调来调去。这里最关键的一点就是最后一个语句:“fs.readdir(dirPathString,readcallback); ” // 正是因为这个语句,整个方案才开始动起来,你的计算机“内存”才开始真正”干活“。 一开始的那些语句别看都在前面,其实都被挂了起来,并没有动起来。 // 计算机最后一榔头干的活,则是打印writecallback(err)中的一个日志。 // 四、fs.feaddir(dirPathString,readcallback); 正是这个函数的调用,瞬间激发了readcallback(...)函数。、 // fs.readdir(dirPathString,readcallback); 这个fs函数的意思是,读取文件目录。fs.readdir(...),这个括弧里必须包含两个参数(A,B),否则fs没法干活。 // fs.readdir(A,B); “A” 指的是“path”, 中文叫“路径”,“B"指的是“callback(err,files)”,中文叫“回调函数”。 // 五、重点来了:当fs函数读取了"A"中的内容后,会迅速把”读取结果“,给到”B“,注意了,我说的是读取结果,而不是一个值。 // 为什么读取了"A"后要给到“B”, "B"又为什么要接收呢? 因为他们都得听 "fs"的,这是fs"的规定,他们必须的干。 // 这个读取结果包括两项:一个是读取”是否成功“ ,二个是成功后“读取的值” ,这两个信息,分别赋予给了 “ readcallback”函数中的“err与files”。 // // 六、好了,说到这里,山路十八弯,已经过了一大半了,后面细节我就不一一啰嗦了,加油,童鞋们.... ================================================ FILE: homework/lesson6/wangzhongbin.js ================================================ /** 目的:把words-from-the-heart项目中的jason文件名,扫描一下,再写入到一个txt文件中。 初步思考: 1. 先获取words-from-the-heart项目的路径,进入到jason文件夹里面。 2. 扫描文件,然后把jason文件名录下来(需要做判定,是否是jason文件)。 3. 再生成一个txt文件,然后把录下来的jason文件名写进去。 **/ // 引入fs模块 var fs = require('fs'); // 获取需要浏览的jason文件夹的路径 var scanPathString = '../../../words-from-the-heart'; // 有一个问题,就是这是一个相对路径,如果项目的文件夹不是这个目录的话,就获取不到路径了。 // 浏览目标文件夹内容,返回一个数组 var outContent = fs.readdirSync(scanPathString); // 定义一个要写入到文件夹的数组writeContent; // 筛选outContent的内容,把不含有.json的文件从数组中剔除出去,并加入到要写入的内容数组writeContent。 var writeContent = []; for (var i = 0; i < outContent.length; i++) { if (outContent[i].indexOf('.json') > -1) {// 判定outContent的元素是否包含有'.json'字符串,如果没有就说明不是.json文件。 outContent[i] = '(' + outContent[i] + ')'; // 百度和google了好久,都没有找到在txt里面,进行分段的符号,就加了一个括号,好辨认一些。 writeContent.push(outContent[i]); // 在writeContent里面加入筛选后确定是json文件的元素。 } } // 开始生成目标文件,并写入筛选好的内容 // 定义要写入的文件路径 var writFilePath = './write_file_name.txt'; // 调用fs的writeFileSync函数来写入文件 fs.writeFileSync(writFilePath,writeContent); /* // 感想 这可能是我第一次真正写代码,从设计到撰写。 刚拿到题目的时候,流汗……(⊙﹏⊙)b。 幸好还是之后老师补了节函数课,又翻了几遍同学的作业,晕眩之后,心里面稍定。 于是先理理思路,先把流程想清楚了。 但对怎么用函数还是不懂。 后来想起来老师让读nodejs api里面的东西,就赶快去网上找了,去读。 然而看到前几行: conset fs = requre('fs')……以及后面的 throw err。 诸如:冒泡,抛出…… 我的天…… 讲得什么黑话,每个词都见过,但就是不知道说的啥。 一头雾水。 放弃,心塞。 就去看了老师第6节的示例代码,然而,还是老师写的代码比较容易懂,比心。 实验了一遍,迅速搞懂了fs怎么用。 但不甘心读不懂nodejs api 里面的文档,弄懂了老师的代码后, 又对照着去读nodejs api 里面关于fs reddir的部分。 这一次有如神助,莫名奇妙地就读懂了开头。 继续读,虽然还是不太清楚,但对throw 有理解了,类似是return。 如果throw err, 函数就停止了。 但接下来再读就又不懂了,对url,buffer之类的,感觉超出了理解能力。 放弃,还是先把作业搞定吧。 跟着老师的步子走,得到了文件夹的名字。 之后遇见了2个难题。 1. 如何筛选出.json文件,搞了好久。 一开始不清楚fs.reddirSync返回的outContent内容是数组还是一串字符串,就打印了outContent 发现是数组。 就用for 函数进行outContent每个元素的检查。 百度了如何检查字符串里面,是否包含有某个字符串,是用indexOf(这个函数区分大小写),就使用了。 这里有一个大乌龙。 我百度了好久,都说indexOf是可以检查字符串里面是否有包含一个指定的字符串。 但我用的时候,一直没有检查出来, 接下来更新outContent内容时,一直包含有不是.json的内容,几乎浪费了2小时。 后来,在关键代码的每一行打入了console.log(1),console.log(2)进行检查…… 然后发现,那个22行的if函数,一直没有执行,然而虽然没有执行,但也没有报错。 最后,发现居然是"json"写错了,我写成了"jason"…… 哭……(⊙﹏⊙)b。 改了之后,顺畅好多。 之后轻松搞完了。 2. 搞完后,发现txt的内容都是没有分行的。 后来看同学的作业,发现有同学是能分行的。 我也希望做成那样的,然后就抄袭了一下,但发现我的搞不成。ㄒoㄒ。 之后我又运行了一下同学们的文件,发现在我的win7的环境下,他们生成的txt文件也是不行的。 好吧,百度…… 百度的结果是只要在字符串后面加上'\n'或'\r'或'^p'就能进行分行。 但我试了之后,都不行。 期间,也百度如何给字符串加一些内容的,就是直接+ 就成了。 虽然一开始我百度的是用.join()函数来进行,不过一直报错,后来看了liuliyuan同学的作业, 发现她是通过“+”来进行的,就用了,成功!^^ 不过依然不能在txt中分段。 就决定先放下去,有机会问下老师,如何进行分段。 不过为了美观,我在每个元素的前后,都加了一个双括号。 打印了之后,还是很美观的。 超有成就感。 做完之后,就迫不及待地噼里啪啦,打了很多字。 之后努力读懂api文档。 */ ================================================ FILE: homework/lesson6/weiyang.js ================================================ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。如果你想查lesson2的内容,就修改下面路径字符串。 var dirPathString = '../../../words-from-the-heart'; // --------------------------------- // 同步方案 var files = fs.readdirSync(dirPathString); // console.log(files); fs.open('words-from-the-heart', 'w+', function (err, fd) { for (i in files) { // console.log(files[i]); if (files[i].indexOf('json') != -1) fs.writeSync(fd, files[i] + '\n'); } }) //fs.writeFileSync('words-from-the-heart', files); ================================================ FILE: homework/lesson6/wengguihua.js ================================================ /* * 异步方案 * * 扫描某个文件夹的所有内容 */ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。如果你想查哪个文件夹的内容,就修改下面路径字符串。 var dirPathString = '../../homework/lesson2'; // 定义要写入的文件路径 var filePathString = './wengguihua_async.txt'; // 定义一个callback函数,用于接收读取文件夹内容后的结果 function readCallback(err,files){ if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { console.log(files); var fileContent = files; // 定义文件内容变量fileContent fs.writeFile(filePathString, fileContent, writeCallback); //调用fs的writeFile函数来写文件 } else { console.log('没有找到任何文件'); } } // 定义一个callback函数,用于接收写文件的返回结果 function writeCallback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } // 调用fs的readdir函数来读取文件夹 fs.readdir(dirPathString,readCallback); ================================================ FILE: homework/lesson6/wenliuxin.js ================================================ var fs = require('fs'); var dirPathString = 'getting-started-with-javascript/homework/lesson1'; function callback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { console.log(files); } else { console.log('没有找到任何文件'); } } fs.readdir(dirPathString, callback); var stringContent = fs.readdir(dirPathString, callback); var filePathString = 'write_file_async.txt'; var fileContent = fs.readdirSync(dirPathString); console.log(fileContent); function callback_writing(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.writeFile(filePathString, fileContent, callback_writing); /* 同步扫描and写文件方案 var fs = require('fs'); var dirPathString = 'getting-started-with-javascript/homework/lesson1'; var files = fs.readdirSync(dirPathString); console.log(files); var outputPathString = 'write_file_async.txt' var fileContent = files; fs.writeFileSync(outputPathString, fileContent); */ ================================================ FILE: homework/lesson6/wenyunxin.js ================================================ fs = require('fs'); var readfile = ('./words-from-the-heart'); var writefile = ('./words-from-the-heart.txt'); function callback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { console.log(files); fs.writeFileSync(writefile, files); } else { console.log('没有找到任何文件'); } } //调用fs的readdir函数读取所有文件 fs.readdir(readfile, callback); ================================================ FILE: homework/lesson6/wufan.js ================================================ /*看了好多同学的作业,我收获很大,这次作业交地时间晚, 一方面是学习节奏没跟上,另一方面看到那么多好作品,所以自己不愿意将就写。 无奈水平有限,只能临摹一个自己还能接受的版本吧。*/ //同步读写 var fs = require('fs');//引入nodejs API文件使用 var writeDirPath = './wufan.txt';//声明定义写入的目录路径,当前的文件位置 var readDirPath = '../myproject/words-from-the-heart/';//声明定义读取的目录路径,一定是相对路径 var files = fs.readdirSync(readDirPath); var fileData = []; for (var i = 0; i < files.length; i++) { if (!fs.statSync(readDirPath + files[i]).isFile()) { console.log('[Warning] ' + files[i] + ' 不是文件跳过'); } else if (files[i].match('\.json$') == null) { console.log('[Warning] ' + files[i] + ' 不是json跳过') } else { fileData[i] =files[i] + '\n'; } } fs.writeFileSync(writeDirPath, fileData); //----------------------------------------- //异步读写 var fs = require('fs');//引入nodejs API文件使用 var writeDirPath = './wufan.txt';//声明定义写入的目录路径,当前的文件位置 var readDirPath = '../myproject/words-from-the-heart/';//声明定义读取的目录路径,一定是相对路径 function readCallback(err, files) {//读取的回调函数,按照API文档的语法规则去写 if (err) { console.log('写文件失败'); } if (files.length > 0) {//第一次出来都是大堆拥挤在一起,分d行写入好看多了,曹振写的很好。 console.log(files); var fileData = []; for (var i = 0; i < files.length; i++) { fileData[i] = files[i]+',\n'; } fs.writeFile(writePath, fileData, write); } else { console.log('没有找到任何文件'); } } function writeCallback(err) {//写入的回调函数 if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.readdir(readDirPath, readCallback); //--------------------------------------------- /*以下的代码输出的txt里面是undefined,到底哪里出了问题? 就在该使用回调函数的时候,用了直接函数,因为调用的异步读取书写函数, 所以应该使用回调函数的*/ //--------------------------------------------- var fs = require('fs');//引用API文件 var readPath = '../myproject/words-from-the-heart';//声明读取文件的相对路径 var writePath = './write_files.txt';//声明写入文件的相对路径 function read(err, files) {//定义读取文件的函数read if (err) { console.log('什么时候才能输出这个句子呢?程序出错时看到了。。。'); } if (files.length > 0) { console.log(files); fs.writeFile(writePath, files, write);//错误版本没有的内容,这是回调read函数时会执行的. } else { console.log('这里没有你要的文件'); } } function write(err) {//定义写入文件的函数write if (err) { console.log('写入失败!'); } else { console.log('写入成功!'); } } fs.readdir(readPath, read);//执行文件 /*错误版本中,这样写就成了直接调用函数,而不是回调了。 var files = fs.readdir(readPath, read); console.log(files); fs.writeFile(writePath, files, write);*/ //---------------------------------------------- /*我的疑惑是,如何把txt文件列表中的","消除,在添加序号的时候 /fileData[i] =i + 1 +files[i]+',\n';/这句出来的结果也不是按照123的顺序出来,因为开头中间又不是json文件的。 编程需要很多思考,思考的时间占据了80%的编程时间。*/ ================================================ FILE: homework/lesson6/wukuipin.js ================================================ var fs = require('fs'); var filePathString = '../write_filename_from_project_words-from-the-heart.txt'; var dirPathString = '../words-from-the-heart/'; function callbackRead(err, files) { if (err) { fileContent(err); } if (files.length > 0) { console.log(files); var fileData = []; for (var i = 0; i < files.length; i++) { fileData[i] = i + 1 + '.'+files[i]+',\n'; } fileContent(fileData); } else { fileContent('没有找到任何文件'); } } function callbackWrite(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } function fileContent(fileContent) { fs.writeFile(filePathString, fileContent, callbackWrite); } fs.readdir(dirPathString, callbackRead); // 这是第五版,使用不同的参数多次回调函数。哈哈哈,这是老师留的 bug,处理错误忘记return或回调,大部分的新手对这个问题视若无睹,我就是其中一位。现在对这个问题有一点点概念,我离高手又近了一步! ================================================ FILE: homework/lesson6/xianengqi.js ================================================ /* * * */ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。 var dirPathString = '/Users/Administrator/my_project/words-from-the-heart'; // 定义要写入的文件路径 var filePathString = './qi.txt'; // 定义一个name_callback函数,用于接收读取文件夹内容后的结果 function name_callback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { var fileContent = files.join('\n'); fs.writeFile(filePathString, fileContent.toLowerCase(), nameCallback); } else { console.log('写文件成功'); } } // 定义一个函数用于接收读取写内容后的结果 function nameCallback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } // 调用fs的readdir函数读取所有的文件 fs.readdir(dirPathString, name_callback); ================================================ FILE: homework/lesson6/xiongliyu.js ================================================ //引入fs模板 var fs = require('fs'); //确认读取文件的相对路径 var dirPathString = '../../my_project/words-from-the-heart'; //确认文件写入的路径 var filePathString = './xiongliyu.txt'; //什么一个变量、一个空盒子来装文件名 var fileList = []; //建立一个callback用于接受读取的信息结果.调用readdir函数 fs.readdir(dirPathString,function read_callback(err,files){ //错误第一原则,判断异步是否有错 if(err) { console.log('文件读取路径错误:' + err); return; } if(files === 0) { console.log('没有文件 err!!'); return; } console.log('找到指定文件,开始筛选所需文件:') //筛选非“.json”文件,并把文件复制到 fileList 中 for(var i = 0; i < files.length; i++) { if(files[i].indexOf('.json') != -1) { fileList.push(files[i] ); console.log(files); } } }); //调用writeFile函数,建立callback fs.writeFile(filePathString, fileList,function write_callback(err) { if(err) { console.log('文件写入失败:' + err); return; }else { console.log('文件写入成功'); } }); ================================================ FILE: homework/lesson6/yammy.js ================================================ // 引入文件系统模组 var fs = require('fs'); // 定义扫描的目标文件夹所在路径 var scan_dir_path_string = "../words-from-the-heart"; // 定义指定的写入文件所在路径 var write_file_path_string = "../achivement.md"; // 调用 fs 的 readdir函数来扫描指定文件夹,读取文件名 fs.readdir(scan_dir_path_string, function(err, files) { // 如果扫描有错误,打印错误,运行结束 if (err) { console.log("scanning failed\n" + err); return; } // 提示扫描成功 console.log("scanning successfully"); // 如果扫描文件中无文件,打印无文件,运行结束 if (files.length === 0) { console.log("oops, no files exist!") return; } // 过滤出以 .json 结尾的json文件,并把数据存在 jsonFilesList 数组中 var jsonFilesList = []; for (var i = 0; i < files.length; i++) { if (files[i].slice(-5) === '.json') { jsonFilesList.push(files[i]); } } // 把收集到的 json 文件名 list,整理出字符串,方便一会儿写入文件 var file_content_string = jsonFilesList.join('\n'); fs.writeFile(write_file_path_string, file_content_string, function(err) { if (err) { console.log("write failed\n" + err); } else { console.log("write successfully"); } }); }); ================================================ FILE: homework/lesson6/yangtieming.js ================================================ //A 同步方案 //引入第三方的file system文件系统函数模块 var fs = require('fs'); //指定需要读取的目标文件夹路径 var readPathString = "./words-from-the-heart"; //指定读取后所写入的文件的存放路径,名称和格式 var writePathString = "./heartWordsList.txt"; //读取内容并赋值给filesContent这个变量 var filesContent = fs.readdirSync(readPathString); //将filesContent变量的内容写入指定目录下的文本文件中 fs.writeFileSync(writePathString,filesContent); //B 异步方案 //引入第三方的file system文件系统函数模块 var fs = require('fs'); //指定需要读取的目标文件夹路径 var readPathString = "./words-from-the-heart"; //指定读取后所写入的文件的存放路径,名称和格式 var writePathString = "./heartWordsList2.txt"; // 自定义一个文件读取函数rend. function read(err,files){ if (err) { console.log('读取文件失败'); } if(files.length > 0){ console.log(files); fs.writeFile(writePathString,filesContent,write); } else { console.log('没有找到任何文件'); } } //将读取的内容赋值给变量filesContent var filesContent = fs.readdir(readPathString, read); //自定义一个write函数,用于返回写入内容这个动作的结果 function write(err){ if(err){ console.log('写文件失败'); } else { console.log('写文件成功'); } } ================================================ FILE: homework/lesson6/yangxuewu.js ================================================ /** * 异步方案 */ //引入 file system 模块 var fs = require('fs'); //定义要查询的路径 var dirPathString = '../../../words-from-the-heart/'; //定义要写入txt文件路径 var writePathString = '../../homework/lesson6/file_name.txt'; //定义一个 callback_read 函数,用于接收读取文件结果 function callback_read(err, files) { if (err) { console.log('------读取文件失败------'); return; } if (files.length > 0) { var fileName = fileArray(files); fs.writeFile(writePathString, fileName, callback_write); } } //定义一个 fileArray 函数,用于将 files 转为逐行打印的字符串 function fileArray(files) { var returnString=''; for (var i = 0; i < files.length; i++){ returnString += files[i] + '\n'; } return returnString; } //定义一个 callback_write 函数,用于接收写入文件结果 function callback_write(err) { if (err) { console.log('------写入文件失败------'); } else{ console.log('------写入文件成功------'); console.log('文件路径:' + writePathString); } } fs.readdir(dirPathString, callback_read); ================================================ FILE: homework/lesson6/yanqingmu.js ================================================ var fs = require('fs'); var readPath = './words-from-the-heart'; var writePath = './write_files.txt'; function write(err){ if (err){ console.log('写入失败!'); } else { console.log('写入成功!'); } } var files = fs.readdirSync(readPath); console.log(files); fs.writeFile(writePath, files, write); /* 尝试默写代码: 用异步的方式完成作业。 以下的代码输出的txt里面是undefined,到底哪里出了问题? //先声明fs,从而调用内部函数的功能 var fs = require('fs'); //声明读取文件的相对路径 var readPath = './words-from-the-heart'; //声明写入文件的相对路径 var writePath = './write_files.txt'; //定义读取文件的函数read function read(err, files){ if (err){ console.log('什么时候才能输出这个句子呢?程序出错时看到了。。。'); } if (files.length > 0){ console.log(files); } else { console.log('这里没有你要的文件'); } } //定义写入文件的函数write function write(err){ if (err){ console.log('写入失败!'); } else { console.log('写入成功!'); } } //执行文件 var files = fs.readdir(readPath, read); console.log(files); fs.writeFile(writePath, files, write); */ ================================================ FILE: homework/lesson6/yimiao.js ================================================ // 同步方案 var fs = require('fs'); var files = fs.readdirSync('./'); var outputPathString = './yimiao.txt'; fs.writeFileSync(outputPathString,files); // 异步方案 var fs = require('fs'); var dirPathString = '../../homework/lesson6'; // ------ function callback(err, files) { if (err) { console.log('fail to read the document'); return; } if (files.length > 0) { console.log(files); } else { console.log('can not find any'); } } // writh 部分 fs.readdir(dirPathString, callback); var filePathString = '.ym_async.txt'; var fileContent = callback(); function callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.writeFile(filePathString, fileContent, callback); ================================================ FILE: homework/lesson6/youshilei.js ================================================ /* * 【第六节课作业】帮我整理数据 * 在words-from-the-heart项目中收到了很多同学的心声。我想把这些json的文件名整理到一个txt文件中。但苦于文件里太多。请帮我写个整理文件名的脚本代码。 * 请参考study/lesson6的的代码,共4个文件。 * 关于相对路径的理解请参考:https://github.com/xugy0926/getting-started-with-javascript/blob/master/topics/%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84.md

 * 【作业内容】
 * 以自己的名字命名一个js文件。 2.先扫描文件夹,再把读到的文件名写入到某个txt文件。 * 【特别注意】 只提交一个你命名的js文件即可,我只要代码。不要给我txt结果文件。

 * 【提交方式】
 * 请向getting-started-with-javascript项目发起pull request。

https://github.com/xugy0926/getting-started-with-javascript

 * 提交homework/lesson6目录下。 */ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。如果你想查lesson2的内容,就修改下面路径字符串。 var dirPathString = '../../../words-from-the-heart'; // 定义要写入的文件路径 var filePathString = './words-from-the-heart.txt'; // 定义一个read_callback函数,用于接收读取文件夹内容并写入txt文件后的结果 function read_callback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { var fileContent = files; fs.writeFile(filePathString, fileContent, wirte_callback2); } else { console.log('没有找到任何文件'); } } // 定义一个wirte_callback2函数,用于接收写文件的返回结果 function wirte_callback2(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.readdir(dirPathString,read_callback); ================================================ FILE: homework/lesson6/zhanggaoyang.js ================================================ //同步方案 var fs = require('fs') var dirPathStiring = '../my_project/words-from-the-heart'; var files = fs.readdirSync(dirPathStiring); console.log(files) var outputPathString = './zhanggaoyang.txt'; var fileContent = files fs.writeFileSync(outputPathString, fileContent); //异步方案 var fs = require('fs'); var dirPathString = '../words-from-the-heart/' function callback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { var fileContent = files fs.writeFile(filePathString, fileContent, callback2); } else { console.log('没有找到任何文件'); } } fs.readdir(dirPathString, callback); var filePathString = './write_file_async.txt'; function callback2(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } //在观察同学们的作业时 //发现在一个简单的“扫描文件,写入文件”的代码上,根据编程水平的不同,每个人看到的问题,遇到的坑也不同。 //小白们往往是照搬模仿成功就已经‘谢天谢地’了。 //高手则能够看到各种细节。还能找出不同的方法应对。 //作为小白,应该学习那些‘高手’们在各种细节上下功夫的态度。 ================================================ FILE: homework/lesson6/zhanglina.js ================================================ /* * 作者:张丽娜 * 时间:2017-08-30 * 版本:version1 * 功能:异步方案: * 1、扫描words-from-the-heart文件夹下的的所有内容 * 2、将其写入到指定路径的文件下 */ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹 var dirPathString = '/Users/zhanglina/ZLNdocument/my_project/words-from-the-heart'; // ----------------------------------- // 异步方案 // 定义一个callback函数,用于接收读取文件夹内容后的结果 function callback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { console.log(files); } else { console.log('没有找到任何文件'); } } //定义一个变量,用于将读取到的文件存放在一个变量中 var files = fs.readdirSync(dirPathString,callback); //定义一个写文件的路径 var outputPathString = '/Users/zhanglina/Downloads/write.txt' // 定义一个callback函数,用于接收写文件的返回结果 function callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.writeFileSync(outputPathString,files,callback) /* * 作者:张丽娜 * 时间:2017-08-30 * 版本:version2 * 功能:同步方案 * 1、扫描words-from-the-heart文件夹下的的所有内容 * 2、将其写入到指定路径的文件下 */ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹 var dirPathString = '/Users/zhanglina/ZLNdocument/my_project/words-from-the-heart'; //定义一个变量,用于将读取到的文件存放在一个变量中 var files = fs.readdirSync(dirPathString); //定义一个写文件的路径 var outputPathString = '/Users/zhanglina/Downloads/write1.txt'; fs.writeFileSync(outputPathString,files,callback); console.log(files); ================================================ FILE: homework/lesson6/zhanglina.md ================================================ --- 2017-08-30 --create-by:zhanglina 补交第6次作业 --- - ##### 关于if(var)值的笔记 > ```javascript > javascript是弱变量类型语言,通俗地就是没有数据类型。任意值都有逻辑值(真或假): > 非真值:null undefined '' 0 false > 真值:任意对象、任意非0数字、任意非空字符串、true > if(a){}表示如果a为真值就执行。 > ``` - ##### 作业部分代码提交 > ```javascript > /* > * 作者:张丽娜 > * 时间:2017-08-30 > * 版本:version1 > * 功能:异步方案: > * 1、扫描words-from-the-heart文件夹下的的所有内容 > * 2、将其写入到指定路径的文件下 > */ > > // 引入fs模块 > var fs = require('fs'); > > // 定义要查询的目标文件夹 > var dirPathString = '/Users/zhanglina/ZLNdocument/my_project/words-from-the-heart'; > > // ----------------------------------- > // 异步方案 > > // 定义一个callback函数,用于接收读取文件夹内容后的结果 > function callback(err, files) { > if (err) { > console.log('读取文件失败'); > return; > } > > if (files.length > 0) { > console.log(files); > } else { > console.log('没有找到任何文件'); > } > } > > //定义一个变量,用于将读取到的文件存放在一个变量中 > var files = fs.readdirSync(dirPathString,callback); > //定义一个写文件的路径 > var outputPathString = '/Users/zhanglina/Downloads/write.txt' > > // 定义一个callback函数,用于接收写文件的返回结果 > function callback(err) { > if (err) { > console.log('写文件失败'); > } else { > console.log('写文件成功'); > } > } > > fs.writeFileSync(outputPathString,files,callback) > ``` > > ```javascript > /* > * 作者:张丽娜 > * 时间:2017-08-30 > * 版本:version2 > * 功能:同步方案: > * 1、扫描words-from-the-heart文件夹下的的所有内容 > * 2、将其写入到指定路径的文件下 > */ > > > // 引入fs模块 > var fs = require('fs'); > > // 定义要查询的目标文件夹 > var dirPathString = '/Users/zhanglina/ZLNdocument/my_project/words-from-the-heart'; > > > //定义一个变量,用于将读取到的文件存放在一个变量中 > var files = fs.readdirSync(dirPathString); > //定义一个写文件的路径 > var outputPathString = '/Users/zhanglina/Downloads/write1.txt'; > > fs.writeFileSync(outputPathString,files,callback); > console.log(files); > ``` > > ================================================ FILE: homework/lesson6/zhaokaili.js ================================================ /* 异步 */ var fs = require('fs'); var dirPathString = '../../../words-from-the-heart'; var filePathString = './zhaokailiAsync.txt'; fs.readdir(dirPathString, function(err, files) { if (err) { console.log('读取文件失败'); } if (files.length > 0) { for (var index = 0; index < files.length; index++) { if (files[index].indexOf(".json") != files[index].length-5 ) { files.splice(index,1); }; } fs.writeFile(filePathString, files.join(" \r\n "), function(err){ if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } ); console.log(files.length); } else { console.log('没有找到任何文件'); } } ); ================================================ FILE: homework/lesson6/zhaoxiaoxin.js ================================================ var fs = require('fs'); var dirPathString = '../../../words-from-the-heart'; function callback1(err,files){ if(err){ console.log('读取文件失败'); return; }; if(files.length>0){ console.log(files); }else{ console.log('没有文件'); }; }; var outputPathString = './zhaoxiaoxin.txt'; var files = fs.readdirSync(dirPathString); function callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } fs.writeFile(outputPathString,files,callback) ================================================ FILE: homework/lesson6/zhaoxiaoxin.md ================================================ 很开心利用JS进行实际操作了。 描述好像不是很准确,很开心能用JS做与工作比较相关的内容了。 今天的作业感觉不是很难,毕竟老师把文件扫描和文件写入的代码都给我们了。而且每个步骤都给了两种方法。只需要拼接一下就好了。 我感觉这次作业的难点在于相对路径这个概念的理解。 既然是相对,就涉及到两个内容.下面是我的理解。希望老师点评。 已网上的一个例子为说明,假设现在有一个页面index.htm,在这个页面中联接有一张图片photo.jpg。他们的绝对路径如下: c:/website/index.htm c:/website/img/photo.jpg 已知页面index.htm的路径,如何用相对路径来找到图片photo.jpg呢? 一个原则是:两者重复的路径都可以省略。 一个自己领悟的重点是:所为当前目录也好,上级目录也好,上上级目录也好,这些都是针对已知的那个内容来说的。比如例子中的index.htm. 自己总结的三步: 1、比较已知内容与需表示的内容的路径,找出相同的路径,然后忽略。比如例子中的c:/website/ 2、查看剩余内容,需表示的内容用来作为查找对象,比如例子中的img/photo.jpg; 3、查看剩余内容,已知内容的剩余部分用来表示路径。比如例子中,已知内容的剩余部分为index.htm 。则说明两者在同一个文件夹下。 最后相对路径为:img/photo.jpg 相同的方法 c:/website/web/index.htm c:/website/img/photo.jpg 步骤3,已知内容的剩余部分为web/index.htm ,说明index.htm 的上一级目录和photo.jpg相同。 photo.jpg的相对路径可以表示为:../img/photo.jpg c:/website/web/xz/index.htm c:/website/img/images/photo.jpg 步骤2,需表示的内容剩余部分为img/images/photo.jpg; 步骤3,已知内容的剩余部分为web/xz/index.htm ,说明index.htm 的上一级上一级目录和photo.jpg相同。 photo.jpg的相对路径可以表示为:../../img/images/photo.jpg c:/website/web/xz/index.htm c:/website/web/img/photo.jpg photo.jpg的相对路径可以表示为:../img/photo.jpg 回到老师的作业 在myproject中clone了项目words-from-the-heart; 代码文件作为作业保存的路径为已知路径,为 myproject/getting-started-with-javascript/homework/lesson6/zhaoxiaoxin.js 需要表示的路径为 myproject/words-from-the-heart/xx.json words-from-the-heart文件的相对路径可以表示为:../../../words-from-the-heart (1)增加了callback函数,相对于增加了一个对结果的判断,根据每一种反应给出一个反馈。 运行错误,也能得到反馈,让整个代码更具包容性。 也让代码对各种情况都有了一个反馈性。 这里的callback,感觉相当于老师讲的程序三步骤里的,参数验证,起这个作用 (2)写代码的过程中,突然有个疑问,什么时候函数名要加括号? 在异步写入时,callback是作为参数使用的,我写的时候加了括号。 什么时候加括号? 我的理解是,函数执行的时候需要加括号。函数作为参数引入别的函数时,不用加括号。 (3)老师给的scan-files-async.js里,貌似漏了files的定义。 但好像没有影响代码的执行。 ================================================ FILE: homework/lesson6/zhaoyinan.js ================================================ //引入file system函数 var fs = require('fs'); //定义读取、输出地址 var dirPathString = '../../../words-from-the-heart'; var outputPathString = './titleInfo.txt'; //定义读取、反馈结果函数 function readCallback(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { console.log('已读取文件内容'); //调用写入函数,将files读取的用容传递给它 fs.writeFile(outputPathString, files, writeCallback); } else { console.log('没有找到任何文件'); } } //定义写入、反馈结果函数 function writeCallback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } // 调用fs的readdir函数来读取文件夹 fs.readdir(dirPathString, readCallback); ================================================ FILE: homework/lesson6/zhengchao.js ================================================ // 引入fs模块 var fs = require('fs') //定义要查询的目标文件 var dirPathString = '../../../words-from-the-heart'; //定义要写入的文件路径 var filePathString = './write_file_async.txt'; // 定义一个函数用于接收读取目标的结果和读取到的内容 function readOutcome(err, files) { if (err) { console.log('读取文件失败'); } if (files.length > 0) { var fileContent = files.join('\n'); fs.writeFile(filePathString, fileContent.toLowerCase(), writeOutcome); } else { console.log('没有找到任何文件'); } } // 定义一个函数用于接收写入目标的结果 function writeOutcome(err) { if (err) { console.log('写入文件失败'); } else { console.log('写入文件成功'); } } // 调用fs的readdir函数读取所有文件 fs.readdir(dirPathString, readOutcome); ================================================ FILE: homework/lesson6/zhengchao.md ================================================ ### Lesson6作业思路 - 作业需求:读取指定路径的文件内容,并将其名称写入到指定路径的TXT文件中 - 异步思路:首先需要调用fs模块的两个子函数,一个是readdir(),一个是writeFile()。 ​ 相比同步函数readdirSync(),异步readdir()可以构建一个callback用于接收读取指定路径得到的内容和结果; ​ 相比同步函数writeFileSync(),异步writeFile()可以判断写入的结果。 ​ 最初本来是想着按照做菜的思路,构建一个读函数,一个写函数和一个调度函数。但实操过程发现很麻烦,不如在函数末尾直接调用`fs.readdir(dirPathString, readOutcome);`来的清晰。 - 感想 ​ 真正去构建函数时,才发现思路真的很重要,也很难。知道的函数库足够多,才能实现更多的功能,在需要的时候才能知道去哪里找出自己需要用到的模块。就好比在代码成功运行第一次之后,发现TXT文件是一大长串,借鉴了一下LiuLiyuan同学的作业,才找到了把每个名字回车的办法。我自己也添加了一个小的method,用来把字符串统一改成小写格式,能更美观一些。 - 期待 想要在将来能实现更多的功能: 比方说阅读readdir() 这个模块的介绍时,看到fs.readdir(path[, options], callback)path还可以是URL(网址),如果这样,是不是就可以把path改成网址保证每次写入的文件都是最新最全的呢? 比方说如何把TXT里边的系统文件如:'.git' / '.gitignore'给屏蔽掉呢? ================================================ FILE: homework/lesson6/zhuting.js ================================================ //引入 var fs = require('fs'); // 定义要查询的目标文件夹。如果你想查lesson2的内容,就修改下面路径字符串。 var dirPathString = '/JavaScriptzt/GitHubxgy/getting-started-with-javascript/homework/lesson1'; //定义写入文件 var filePathString = 'heart.txt'; // ----------------------------------- // 异步方案 // 定义一个callback函数,用于接收读取文件夹内容后的结果 function callback1(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { console.log(files); //将读取的文件写入 fs.writeFile(filePathString, files, callback); } else { console.log('没有找到任何文件'); } } //调用fs的readdir函数读取所有文件 fs.readdir(dirPathString, callback1); // 定义一个callback函数,用于接收写文件的返回结果 function callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } ================================================ FILE: homework/lesson6/zouhainan.js ================================================ var fs = require('fs'); var dirPathString = '../files/my_project/words_from_the_heart/words-from-the-heart'; var outputPathString = './fileNames_async.txt'; fs.readdir(dirPathString, function (err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { console.log('到这里都没有问题'); console.log(files); fs.writeFile(outputPathString, files, function (err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } }); } else { console.log('没有找到任何文件'); } }); ================================================ FILE: homework/lesson6/谢玉辉六课作业.js ================================================ /* * 同步方案 *异步我是思考了几个小时一直搞不定。。。然后看了同学的作业才搞明白。多思考多测试,搞不定再看同学的作业可以立马恍然大悟。 */ // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。如果你想查lesson2的内容,就修改下面路径字符串。 var dirPathString = '../../homework/lesson1'; var outputPathString = './write_file_sync.txt'; // --------------------------------- // 同步方案 var fileContent = fs.readdirSync(dirPathString); fs.writeFileSync(outputPathString, fileContent); //-------------------------------------------------------------------------- //异步处理 //.................................................................////// // 引入fs模块 var fs = require('fs'); // 定义要查询的目标文件夹。如果你想查lesson2的内容,就修改下面路径字符串。 var dirPathString = '../../homework/lesson1'; var filePathString = './write_file_async.txt'; // ----------------------------------- // 异步方案 // 定义一个callback函数,用于接收读取文件夹内容后的结果 function c(err, files) { if (err) { console.log('读取文件失败'); return; } if (files.length > 0) { var fileContent = files fs.writeFile(filePathString, fileContent, callback); } else { console.log('没有找到任何文件'); } } function callback(err) { if (err) { console.log('写文件失败'); } else { console.log('写文件成功'); } } //调用fs的readdir函数读取所有文件 fs.readdir(dirPathString, c); ================================================ FILE: homework/lesson7/GaoXianfeng.md ================================================ ## 第七课总结 ### 项目地址代码 https://github.com/ruoshuigao/lesson7_homework ### 心里话地址: https://ruoshuigao.github.io/lesson7_homework/ ### 作业与课程内容总结 1. 课程内容部分:自己断断续续的学习了很长时间 JavaScript,但是每当在工作中遇到需要写 JS 时才意识到自学的 JS 又都还回去了,每次的工作任务还是上网查资料和文档完成,因为工作中写的少,自己平时也没有动手做一些额外的项目来巩固所学内容,所以每次学习的知识不久之后就又会忘掉,这次学习中,以前学习的内容慢慢涌现出来了。例如:课堂中老师讲授的函数定义与函数表达式。 2. 作业部分:参考了老师的实例,但是主要是自己思考思路、在 GitHub 中查阅 jsonfile 官方实例完成作业中数据读取功能。至于 html 文件,直接拷贝老师源代码。此次作业共用时4.5个小时,个人感觉作业完成的并不轻松。 ================================================ FILE: homework/lesson7/anjiancai.md ================================================ 项目地址:https://github.com/jiancaian/testwordsfromtheheart 网页地址:https://jiancaian.github.io/testwordsfromtheheart/ 操作顺序: 1、在words-from-the-heart文件夹下新建一个test文件夹,在文件夹下新建一个package.json文件(一开始自己错误的命名成.js),然后在编写的package.json文件下打开集成终端,cd到test后,输入npm install,自动安装package.json文件中的jsonfile第三方包,此时在test文件下有node_modules文件夹生成,即安装的jsonfile包。 2、在test文件夹下新建一个index.js文件,copy徐老师的homework_sample.js文件内容。徐老师已经提示有bug,自己共修改三处:一是修改第八行中目标文件夹路径,即var pathString = '../../my_project3/words-from-the-heart/',看到微信群中说到用../../向上返回文件夹,与终端中用cd ..类似;二是第26行中筛选文件夹中的json文件,应为files[i].includes('.json')这样表示;三是第38行读取json文件内容并写入至jsonList,应是jsonList.push(content)。运行index.js文件,正常下生成all_words和error_data的json文件。 以上两步实现了把内容读取至一个json文件中。接下来重点是把json文件内容展示到html中。 3、在test文件夹下新建一个index.html文件,同样copy徐老师的index.html,并复制粘贴包含style.css和vue.min.js的public文件夹。然后修饰index.html文件,一共更改了两处,一是在标题JavaScript编程入门下加入文本信息,

授课老师:徐高阳

授课时间:20170808--20170914 每周二和周四晚上8:00--9:00

网页制作:安建才 20170910--23:00

二是把汇总到all_words.json文件中内容全选复制,赋值给index.html文件第56行中变量wordsList。完成以上操作,即可用点击index.html文件查看效果。 4、部署到github上。 新建一个库testwordsfromtheheart,生成一个地址https://github.com/jiancaian/testwordsfromtheheart.git,然后用终端cd words-from-the-heart,git clone 上述地址,此时在words-from-the-heart文件夹下生产一个testwordsfromtheheart文件夹,将通过上述1、2、3步在test文件下的内容全选并复制,粘贴至testwordsfromtheheart文件夹下。此时在终端依次执行git status, git add -A, git commit -m "the first html", git push origin master,完成从本地仓库上传至远程仓库。 接下来就是生产一个网页文件的地址,在testwordsfromtheheart仓库中点击setting,然后下来找到GitHub Pages 的 Source,选择master branch ,然后点击save保存,稍等片刻,GitHub就会给你生产一个网址,即https://github.com/jiancaian/testwordsfromtheheart,点击网址就能看到部署的网页。 总结:以上步骤基本都是抄的,只对其中的很小一部分进行修改,通过完成以上步骤,对建立网页 有了初步的认识。接下来就是优化网页,让网页好看一些。 在操作前心理一直畏惧,感觉好复杂啊,自己搞不定。实操一遍,觉得还可以,重点是思路要清晰,完成后幸福感满满。 【项目背景】 前期收集了同学们的心里话,我想把这些内容整理到一个页面上展示。 【技术要求】 1. 使用filejson这个库,把同学们的json文件汇总到一个json文件中。 2. 用vue实现一个html,把json文件的内容展示出来。 【提示】 1. 先扫出所有的文件名。 2. 过滤掉非json的名字,得出一个结果全部是json的文件名。 3. 利用jsonfile的方法循环读取内容到一个json的数组变量中。 4. 将内容写入到一个json文件中。 5. 把最终得到的json文件的内容反映到html上,请参考github_index/index.html 6. 修饰一下你的html效果。 7. 部署到你github项目的页面上。 我给出了一个homework_sample.js供你参考。为了不让你直接抄,我里面设置了2个bug,可能需要你调试才能找出bug。 ================================================ FILE: homework/lesson7/chenguoqiang.md ================================================ # 学编程一小步,人生一大步 参加了新生大学的编程入门课,最主要的原因就是便宜。之所以会想到学点编程,笑来老师建议每个人都要学点编程,想着学不下来也不会有很大损失。 课程总共有13节课,目前已经上完了12节课。前5节课并没有难度,都是一些基础的知识点,只要花些时间,不懂的地方多重复几遍。如果说有难度的话,没有接触编程的未知,会让你有恐惧感。你明明知道老师说的是中国话,就是不明白什么意思。仅仅过了十几天,回头看当时的课程内容,它们变得有点亲切。 出差的缘故,从第五节课开始,没有看直播课程,整个学习节奏就乱了,作业没能及时交。看课程回放,第一遍像是听天书,第二遍、第三遍··· ···,时不时的要拉回某个点再听一遍。作业并不是很顺利,就卡那里近一个小时动弹不得,你问老师,也没有发现问题,流程和命令都对,作业老师也会给出范本。就在你绝望的顶点,不经意的瞬间发现是命令拼写错了。 这个课程特色,老师不教编程语法,这些语法部分自学。直接做项目,做一个自己的网站。前面几节课的作业,都是为网站项目做铺垫。编程的知识,会用才算学到,学到了不会用,那就白白浪费了时间。网站的作业是第七课的作业,尽管之前有所铺垫,看着作业,不知道怎么下手,老师给预留了比较长的时候,利用这些时间又去看了前面课程内容,看完后依然不知道怎么下手。 有很多同学都提交了作业,心理更着急了,还是不知道从哪开始。偷偷观摩同学做好的作业,知道了老师设置的两个bug的位置,然后按照老师给的范例,顺利迈出了第一步。后面一切都按部就班,当看到自己网站建好的样子,很有成就感,完成了自己想都不敢想的事情。 一个月的编程学习的收获:碰到的问题并不需要都整明白,可以选择夸过去,项目先跑起来,而不是困在原地。就像写作,不能因为写不好而不写,正是因为写不好,所以才更要写。有些问题回头去看也许就不存在了。 人也需要盲目的自信,下辈子这个世界上就多了一个著名程序员。 网页地址:[https://chenguoqiang007.github.io/My-page/](https://chenguoqiang007.github.io/My-page/) ================================================ FILE: homework/lesson7/chenrushan.md ================================================ # homework lesson7 ## 仓库地址 [words-in-hearts](https://github.com/Rushan-Chen/words-in-hearts) ## 网页地址 [words-in-hearts](https://rushan-chen.github.io/words-in-hearts/) ================================================ FILE: homework/lesson7/chenyanxing.md ================================================ JavaScript编程入门_lesson7 网页地址: https://pingcha.github.io/words_collection/ 项目地址:https://github.com/pingcha/words_collection 碰到的问题 创建好项目,打开本地制作的网页,发现心里话这里没有显示出来: ![Snip20170906_136](/Users/chenxiaoqing/Desktop/Snip20170906_136.png) 回去重新对照老师教材的代码,花了一天去对照代码都没想明白是怎么回事,然后我点看本地页面的检查,发现这里说Vue没有定义 ![Snip20170906_137](/Users/chenxiaoqing/Desktop/Snip20170906_137.png) 我重新认真的回去看了老师教材Vue的定义:https://github.com/xugy0926/getting-started-with-javascript/blob/master/study/lesson7/github_index/easy_vue.html 找到了问题的所在: ![Snip20170906_138](/Users/chenxiaoqing/Desktop/Snip20170906_138.png) 前面学习了如何引入第三方模块并执行后产生全局对象的js文件,没有写到html文件里面,所以报错‘没有引入vue模块’。所以事实上是我对如何引入第三方库的概念不清,还一直以为问题是出在引用的函数名上,参考同学的作业然后一直不停修改,也还是搞不明白。 未解决的问题: 1.导出数据到json文件里面,发现data挤在一堆,易读性差也不美观,还好有老师的提点:在vscode中,快捷键 alt + shift + F ,一键格式化代码。 2.对于某些函数片段的理解还不够,周末要多花点功夫研究。 3.教材代码: 把含有“json”字符的文件名过滤出来(需要一一判断—要用到循环语句for) var jsonFilesList = []; for (var i = 0; i < files.length; i++) { if (files[i].slice(-5) === '.json') { jsonFilesList.push(files[i]); } } try…catch捕获错误的方法,直接用了,还木有研究 for (var i = 0; i < jsonFilesList.length; i++) { // 同步读取文件如果发生错误,用try...catch捕获该错误 try { // 读取json文件内容(文件路径+文件名),并存在jsonList数组内 var contentJson = jsonfile.readFileSync(readDirPath + jsonFilesList[i]); jsonList.push(contentJson); } catch (err) { // 如果读取错误就把错误的文件名写入到errorFiles数组内 errorFiles.push(jsonFilesList[i]); } } 作业心得 1.看到同学作业做得又快又好,我要更加用心才行。 2.一碰到不懂,觉得难,在以前我是很容易放弃的,没有想到的是跟着老师的脚步一步步加深认识JavaScript后,越觉得是门很有趣的语言,作业因为之前搬家而耽误了一段时间,但是不会拖延着不做,反而做的时候挺带劲的,特别是做出来后,那种攻克后的小成就感,让心情特别好呢!虽然还做不到不借鉴同学作业独自想明白然后完成作业,不过,适时向高手请教,帮助你上手,才不至于死磕一个“难点”未果把耐心给磨没了,很可能会导致放弃。 ================================================ FILE: homework/lesson7/chenziwen.md ================================================ # 第七课作业——展示同学们的心里话 ## 项目地址 > https://github.com/WindBlewSails/myFirst-repository ## 心里话展示页面地址 > https://windblewsails.github.io/myFirst-repository/ ## 学习感受 这节课老师教了我们用Bootstrap来套用CSS表现,用VUE来展示数据,用JSONFILE第三方库来读取JSON文件内容。 完成这个作业用了我挺多时间的,先是解决老师设置的2个BUG,理清代码运行的过程。然后是搞清楚Bootstrap怎么套用,搞清楚VUE怎么把数据展现出来。最花时间而又没有成果的是想把头像和名字组合成一个正方形,心里话全部放到顶部的固定的位置,鼠标悬浮在哪位同学的头像上,顶部就会出现那位同学的心里话。或者是心里话就悬浮在头像的旁边。 But no Results。 CSS 和 VUE没有搞明白,只能按老师演示的完成了最基础的功能。 这又是眼高手低了呀。 ================================================ FILE: homework/lesson7/cloudyview.md ================================================ #Lesson 7 HomeWork ## [页面链接]( http://daijun.info/lesson7-homework/) ## [GITHUB项目网址](https://github.com/cloudyview/lesson7-homework) 通过调试徐老师的程序,完成了作业,CSS方面也自己尝试了BOOTSTRAP的强大力量,VUE初步体验,感觉很爽。 这次作业,我总感觉要是还要手动去吧JSON文件里面的数据COPY一次到HTML里面,太罗嗦,就尝试用三段HTML代码来组合成一个HTML文件。美其名曰:动态。 具体做法: 1. 首先将index.html拆成两部分,分别是开头和结尾。中间的数据部分就删除。 2. 然后在老师的例程基础上做修改和调试,先读入开头,然后用fs.writeFileSync()函数创建一个index.html.由于这个函数每次执行都会将内容清零,然后再写入,所以相当于每次执行都在创建index.html。 在写入的时候,用了同步函数,是发现如果用异步,会出现写入顺序错误的问题。暂时还不清楚具体原因。估计是因为JSON读写的那段,用了同步,那么系统会首先执行同步的那些代码,所以,虽然我创建Index.html的函数先执行,结果还是会后出。 3. 然后是JSON文件读取,写入的部分,就直接用fs.appendFile()函数来添加到index.hmtl的后面。 4、然后再后面再添加一段结尾的部分,至此,完成! 这个方法的好处是,我每次只需要执行我的JS文件,就能读取最新的“心里话”实现更新。 我考虑是否利用fs.Watch()函数,自动来监控。不过这样就需要做成后台自己运行的程序,或者要用web页面来发起请求,这些技巧目前都还不掌握,以后再考虑。 当前要解决的是乱码的问题,还在调试。功课先交,慢慢优化。 ## 学习心得 1. 只需要调用一次的函数,就直接在要用的地方执行。在CALLBACK的位置,实在是好方便的说。 2. 用括号的时候,必须成对打出,否则很容易就多了或者少了。即使是VSCODE帮你,也不要贪图这个方便,只打一边。为这个括号,花费了我超多时间来调试程序。 3. 同步与异步,还需要多多理解。 4. 编码的问题在中文世界里真的很重要,目前还有好多好多乱码在文件里,应该是读取的时候就出问题了,现在在考虑如何解决,学习中。 ================================================ FILE: homework/lesson7/cuiyuwei.md ================================================ 作业地址: 团队 https://fengkaiwater.github.io/Beijing-Olympics/ ================================================ FILE: homework/lesson7/dangfeipeng.md ================================================ https://dangfp.github.io/words_from_heart/index.html ================================================ FILE: homework/lesson7/dengxy0907.md ================================================ 第七课作业 ========== > 项目地址:https://dengxy0907.github.io/myFirstJavascriptProject/ > 项目仓库: https://github.com/dengxy0907/myFirstJavascriptProject 心得(更像我情绪的描述) --- > 因为自己生活中的意外和自己付出的时间不够多,导致课落下了,在急于完成作业的焦虑中一直在填自己给自己挖的坑。说实话,我这点小困难在其他同学面前不值一提 >虽然在敲代码时整体上很静,但是事实上还是有点着急的。我在哪里,我要什么,真的很重要,只有我脑子清楚了,代码才会跟着我走,而不是一心为了完成作业跟上进度而被代码带着思绪走 >这次依旧是最小可用品,之后再完善,感觉这个项目我可以像舍友反复打单机剧情一样反复啃了。 > 关于套路,我自己是很喜欢套路的,而去罗胖也说套路就是非正式的知识(大概是这个意思,原话忘记了),因为没有什么经历,所以只能拿游戏举例了,套路让我最快的了解了这个游戏且在我的套路里能打败实力高过我的玩家,但是我毫无进步,一直都是在舒适区里。 > 之前的php是真的不知道该做什么几乎停止了学习,加上忙于shadowsock的事情就把php放下了,然后就遇到了这门课,我真的挺幸运的。我的js学习也能开始了,我是电子商务专业,今年大三了,之前学校的课程真的很水,今年终于上了专业课了,真的,感觉大部分课程要做的就是这次js课的内容,这种感觉很棒。 ### 记录的错误汇总(因为屈指可数,就不分先后了) >先安装库,遇到问题,package.json包在test文件夹下,npm安装应该在test下安装 >vue找不到,搜索了很多,也安装了Vue.js devtools 。最后在才在检查中发现我把Vue打成了vue,当然找不到了。 >找不到jsonfile------>最后在微信聊天记录找到解决 npm install --save jsonfile ;不理解安装第三方库和插入第三方库有什么区别 >说jsonfile.writeFileSync 不是一个function;这两行我复制了其他同学的代码,但是代码是一样的,我的就不行,我也是英文输入法啊,不知道为什么,有空调试一下,是不是我哪里用了中文的输入法或者是其他原因 !(问题图)[https://ws2.sinaimg.cn/large/006tKfTcgy1fji1y2p22hj31b018ggvp.jpg] > 哇,这里不知道又发生了什么,界面最左边出了一条绿线,然后这个图就。。。 ### 成功汇总文件时想说的话 > 1、到这里的心里话,在我这次重新再来的时候收到了老师的回信,感谢老师对我们的付出 > 2、确实之前有点着急,除了一眼看出的扫描文件处的错误之外就没有注意其他的了,过于着急想打通流程,完全违背了初衷 > 3、直到晚上的课才隐约明白为什么pr“没有”成功了,是不是因为现在的pr要老师看完才算成功 > 4、之所以我觉得是不是pr出错是因为太久没有同步fork了,然后是先git到自己的git上才同步fork,git调用了我的编辑器让我说明为什么这次同步是必要的 > 5、强行关闭会提示打断git vi的运行,之后在的重新fork后,因为好奇,又同步了一次,出现了同样的界面(刚fork就同步fork) > 6、因为我看pr里依旧是显示这个pr可以通过的(大致意思),所以就没有去注意 > 7、至于编程,虽然一直出错,但是我没有厌烦过,只是着急于课程落下了,不知道具体的应该去哪里找,敲代码时,我整个人都宁静了,很舒服,感觉每时每刻都在心流中 > 8、今晚的课上完我才知道我的php课不只是学了一点代码,我的php老师也让我完成了大半的入门,虽然是垫底的二本,但是很幸运遇到了这么多好老师 ================================================ FILE: homework/lesson7/diaozhicong.md ================================================ #第七次课作业 ## 【网页部署】 https://sam-tiao.github.io/Diaozhicong/ 【作业地址】 https://github.com/Sam-Tiao/Diaozhicong ## 学到的关键知识点: 1.用后端jsonFile第三方库的方法读取众多文档写入一个Json文档; 2.初次用前端vue库的锚点方法将后端数据引入前端。 思考点: 本次作业,不知能否实现汇总的Json文档地址直接在前端vue的引用中实现直接挂钩(而不用拷贝进文档中),后面Json有更新,web端直接更新? 如果能实现,该如何实现?需要那方面的知识? ================================================ FILE: homework/lesson7/fangqingyang.md ================================================ ### 静态页面地址 ### https://vfongv.github.io/LetMeTry/ ### 项目地址 ### https://github.com/vFONGv/LetMeTry ### 要解决的问题 * 网页加载太慢 * 页面排版,巨幕的背景图片,页面的背景图片 ​ ### 体会 1 走路的时候,总能想到点东西。 2 看文档是必须的。 3 抄,抄完后要看得明白。 4 重复敲代码是必须的。 ================================================ FILE: homework/lesson7/fengkai.md ================================================ 1.编程方法论 a. 声明 -> 变量 定义 -> 内存 赋值 -> 变量 b. 顺序 选择(分支) if ... 循环 for 、while ... c. 封装; 调用服务,使用黑箱进行快速学习,适用初阶、中阶; d. 编程世界里有一种机制,把不相关或低相关度的两件或者多件事产生联系; e. 模仿是最好的初级训练 f. 对于编程语言的理解方法:把一句话拆成若干个单词,拿每个单词去执行,然后组合起来,整句话也就理解了;机器语言也是语言。 下断点 / console.log g. 在项目中成长 h. 编程的过程就是把数据传来传去 i. 减法比加法好 j. 好的程序员 = [写文档, 项目管理, PPT, 简洁的代码, ... ] 2. 作业地址: 个人 https://fengkaiwater.github.io/myPage/indexHeart.html 团队 https://fengkaiwater.github.io/Beijing-Olympics/ ================================================ FILE: homework/lesson7/guowei.md ================================================ # JS小白入门不放弃 homework_lesson7 ### 提交作业 项目地址:https://github.com/Wei02320/words_collection 网站地址:https://wei02320.github.io/words_collection/ ## 反思 ### 学习最怕的不是不懂,而是傲慢。 这几天不管是在看回放还是做作业上都有些懈怠,反思一下:作业难度增加,完成没之前那么顺利,正向反馈减低,花时间变得更少,更难完成,走进死循环。一看日期,明天便是最后一节课,想起第一次课的JS小白不放弃里所说,放下傲慢。拿起键盘就是干! ### 作业要点和难点 * 使用filejson这个库,把同学们的json文件汇总到一个json文件中。 * 用vue实现一个html,把json文件的内容展示出来。 ### 思路 其实老师在作业里都有留下sample,我们需要对代码进行修改和调试,大大地降低了难度。做的时候我也在想,不参考代码我能不能写出来。 **不过,不花时间还想一步登天,做梦呢!** 1.在github上新建一个项目:words_collection 2.先使用filejson这个库,安装package.json,引入第三方库。在这里犯了一个大错误,将*npm install*输成*npm install package.json*,以致于下一步一直报错。好在英俊潇洒的徐老师及时指出错误,并丢过来一个问题: >为什么*npm install package.json*也可以执行? *npm install*可以命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。而package.json文件本质上是一个对象,*npm install package.json*相当于单独安装package.json,所以报错? 3.把同学们的json文件汇总到一个json文件中。代码偷懒参考老师的sample: 需要注意的是,有三处需要修改哦! ``` var pathString = '../words-from-the-heart/'; ``` ``` var jsonFiles = []; for (var i = 0; i < files.length; i++) { if (files[i].includes('.md')) { jsonFiles.push(files[i]); } } ``` ``` var jsonList = []; var errorFiles = []; for (var i = 0; i < jsonFiles.length; i++) { try { // 读取json文件 var content = jsonfile.readFileSync(pathString + jsonFiles[i]); jsonList.push(jsonFiles[i]); } catch (err) { // 如果读取错误就把错误的文件名写入到errorFiles数组内 errorFiles.push(jsonFiles[i]); } } ``` 请开动脑筋找出来! 4.之后便是用vue实现一个html,然后把读取的json数据展示到网页上。新建index.html文件,copy徐老师的index.html(下一步想加一些新的东西玩玩,装修一下网页),并复制粘贴包含style.css和vue.min.js的public文件夹。 5.部署到自己的github项目的页面上。 *大功告成!明天结课前我要完成第9课,不多写了,看回放去了!* ================================================ FILE: homework/lesson7/hanwei.md ================================================ ### 主页网址 https://freedomsky11.github.io/JScouser-homework-7/ ### 代码网址 https://github.com/freedomsky11/JScouser-homework-7 ================================================ FILE: homework/lesson7/hewei.md ================================================ # 第七课作业 ## 团队概况 - 何伟:[https://github.com/Dream4ever/](https://github.com/Dream4ever/) - 王颖:[https://github.com/MaggieWong27/](https://github.com/MaggieWong27/) - 王沙沙:[https://github.com/shashawang](https://github.com/shashawang/) - 谢泓升:[https://github.com/Risexie/](https://github.com/Risexie/) ## 作业地址 - 仓库地址:[https://github.com/Dream4ever/JavaScript](https://github.com/Dream4ever/JavaScript/) - 网页地址:[https://dream4ever.github.io/JavaScript/lesson7.html](https://dream4ever.github.io/JavaScript/lesson7.html) ## 整体思路 最开始是想做一个里程碑式的效果,来展示大家的心里话,就是类似下图的这种效果。 ![网页里程碑效果图](https://raw.githubusercontent.com/Dream4ever/Pics/master/milestone-webdesign-vertical.jpg) 但是在后面做网页的过程中,发现大家的心里话字数不一致,想要做出来预期中的效果,就要对原来的设计方案进行更改。而且工作和生活上的事情也不少,没有足够的时间来做出自己希望中的效果,只好作罢。 作业的基本内容倒是完成了,但是离自己期望中的样子还差很远,还要付出更多的努力才行。看着身边的同学一个个进步神速,自己心里那个焦虑啊。 下面就来讲讲本次作业的整体流程和遇到的问题。 ### 一、后台读取 `json` 文件内容 后台读取各个 `json` 文件内容的基本流程如下: > 1. 先用 `fs.existPath()` 检查保存心里话的文件夹路径是否正确,正确则继续,否则就中止程序。 > 1. 接着用 `fs.readdir()` 读取文件夹中的所有文件及文件夹至 `files` 这个数组中。 > 1. 在读取完成之后,只保留其中的 `json` 文件,删除所有扩展名不是 `json` 的文件以及所有文件夹。并且将 `files` 数组中的每个元素,由原来只是保存 `json` 文件名,改为保存各 `json` 文件的完整路径。 > 1. 用同步读取的方式 - `fs.readdirSync()` - 将每个 `json` 文件的内容读取至 `fileContent` 数组中,并将读取失败的文件名保存至 `errorFiles` 数组中。 > 1. 最后,将成功读取到的所有 `json` 文件的内容保存到 `content.json` 文件中,并将所有读取失败的文件名保存至 `error.json` 文件中。 ### 二、前台读取 `json` 内容 前台读取 `json` 文件内容的方法很简单,因为用的都是现成的库的功能,所以几行代码就搞定了,也没遇到什么问题。 > 1. 在第一阶段,已经把大家的心里话都保存到了 `content.json` 文件中,然后在终端中将该文件上传至 GitHub 的仓库里:[content.json](https://raw.githubusercontent.com/Dream4ever/JavaScript/master/public/lesson7/content.json)。这样就可以用 `ajax` 请求来获取仓库上的内容,从而开始最基本的前后端交互。 > 1. 在 `main.js` 文件中,采用 `ajax` 请求来获取上面的 `content.json` 文件的内容。如果读取成功,则用 `JSON.parse(data)` 来解析返回的数据,并将解析后的数据与 `Vue` 实例 `vm` 中的数据项 `words` 进行绑定。这样,就可以在前端页面中使用读取到的内容了。 ### 三、浏览器页面渲染数据 在获取到数据之后,就要开始对数据的渲染了。因为有了 `Vue` 这个强大的前端框架,以前很多需要用 `jQuery` 来手动操作的部分,现在都不需要考虑了,只要把主要精力集中在页面样式和业务逻辑上就可以了。说一下在做这个简单页面过程中的几个关键点。 > 1. 如何让大家的心里话依次在左边和右边进行展示?这里当然要用数组,将下标为偶数的元素 0、2、4…… 在左侧显示,将下标为奇数的元素 1、3、5…… 在右侧显示。那么如何能够获取到数组的下标呢?这就需要稍微深挖一下 `Vue` 中的 `v-for` 这个指令了。`v-for` 这个指令的第二个参数用来表示当前项的索引,这刚好就是我们所需要的。在前端页面中,用 `v-for="(word, key) in words"` 这条指令,来获取每一个元素 `word` 及其索引 `key`。这样就可以根据每个元素的索引值,来决定是让它在左边显示还是在右边显示了。 > 1. 在获取到元素及其索引之后,就需要为左侧和右侧的元素分别设置不同的样式了。经过一番研究,发现可以用 `Vue` 中的条件渲染来实现这个需求:对于索引分别为偶数和奇数的元素,利用 `Vue` 中的条件渲染这个功能,用 `v-if="key % 2 == 0"` 这个条件进行判断,然后分别用 `